ASP.. NET 5 / MVC 6控制台托管应用

本文关键字:控制台 应用 MVC NET ASP | 更新日期: 2023-09-27 18:01:22

在MVC5中,我有一个控制台应用程序,它将使用microsoft . owen . hosting . webapp . start(…)来托管一堆控制器,这些控制器将从放置在外部文件夹中的程序集动态加载,并通过API调用在它们上运行一些自定义初始化。通过这种方式,我可以将参数传递给在运行时确定的初始化方法(并且不会像维护配置文件那样笨拙)。

在MVC6中,自托管现在完成了,据我所知,由DNX运行时使用Microsoft.AspNet。托管,但这都是通过命令行完成的。有没有一种方法可以让我在c#控制台应用程序中自托管,这样我就可以保持这个初始化架构?

ASP.. NET 5 / MVC 6控制台托管应用

…我有一个控制台应用程序,它将使用microsoft . owen . hosting . webapp . start(…)来托管[和]传递参数给初始化方法,这些参数是在运行时确定的…

在ASP。净4。x我们使用OWIN主机在控制台应用程序中自托管。我们直接运行MyApp.exe。它的Main()方法调用WebApp.Start()来创建OWIN主机。我们使用IAppBuilder的实例通过appBuilder.Use()构建HTTP管道,并将其与appBuilder.Build()链接在一起。这些都在Microsoft.Owin.Hosting命名空间内。

是否有一种方法可以让我在c#控制台应用程序中自托管,这样我就可以保持这个初始化架构?

在ASP。. NET Core rc2我们使用IWebHost在控制台应用程序中自托管。(这不是一个OWIN主机,尽管它是由OWIN启发的。)我们直接运行MyApp.exeMain()方法创建一个新的WebHostBuilder(),我们使用它通过webHostBuilder.Use()构建HTTP管道,将其与webHostBuilder.Build()链接在一起。这些都在Microsoft.AspNet.Hosting命名空间内。

关于Pinpoint的答案,ASP中的。. NET Core rc1我们需要运行dnx.exe而不是直接运行我们的应用程序。WebHostBuilder的工作隐藏在dnx.exe可执行文件中。Dnx.exe也启动了我们的应用程序。我们的应用程序的Main()方法调用WebApplication.Run(),之后我们使用IApplicationBuilder的实例通过调用appBuilder.Use()将中间件添加到HTTP管道中。我们的应用程序和dnx.exe共同承担创建/配置主机的责任。它很复杂,我很高兴它在rc2中改变了。我认为在rc1中,相当于OWIN的WebApp.Start()的是WebApplication.Run()
ASP.NET 4.x            ASP.NET Core rc1           ASP.NET Core rc2
N/A                    Dnx.exe                      N/A
MyApp.exe              MyApp.dll                    MyApp.exe
Main(args)             Main(args)                   Main(args)
WebApp.Start()         WebApplication.Run(args)     N/A   
appBuilder.Use()       appBuilder.Use()             webHostBuilder.Use()
appBuilder.Build()     N/A                          webHostBuilder.Build()
一些引用

http://www.asp.net/web-api/overview/hosting-aspnet-web-api/use-owin-to-self-host-web-api

https://msdn.microsoft.com/en-us/library/microsoft.owin.hosting.webapp%28v=vs.113%29.aspx

武士刀的WebApp静态类已被WebHostBuilder所取代,后者提供了更灵活的方法:https://github.com/aspnet/Hosting/blob/dev/src/Microsoft.AspNet.Hosting/WebHostBuilder.cs.

你可能已经在没有意识到的情况下使用了这个API,因为当你在项目中注册一个新的web命令时,它是托管块使用的组件。json(例如Microsoft.AspNet.Hosting server=Microsoft.AspNet.Server.WebListener server.urls=http://localhost:54540)并使用dnx(例如dnx . web)运行:

namespace Microsoft.AspNet.Hosting
{
    public class Program
    {
        private const string HostingIniFile = "Microsoft.AspNet.Hosting.ini";
        private const string ConfigFileKey = "config";
        private readonly IServiceProvider _serviceProvider;
        public Program(IServiceProvider serviceProvider)
        {
            _serviceProvider = serviceProvider;
        }
        public void Main(string[] args)
        {
            // Allow the location of the ini file to be specified via a --config command line arg
            var tempBuilder = new ConfigurationBuilder().AddCommandLine(args);
            var tempConfig = tempBuilder.Build();
            var configFilePath = tempConfig[ConfigFileKey] ?? HostingIniFile;
            var appBasePath = _serviceProvider.GetRequiredService<IApplicationEnvironment>().ApplicationBasePath;
            var builder = new ConfigurationBuilder(appBasePath);
            builder.AddIniFile(configFilePath, optional: true);
            builder.AddEnvironmentVariables();
            builder.AddCommandLine(args);
            var config = builder.Build();
            var host = new WebHostBuilder(_serviceProvider, config).Build();
            using (host.Start())
            {
                Console.WriteLine("Started");
                var appShutdownService = host.ApplicationServices.GetRequiredService<IApplicationShutdown>();
                Console.CancelKeyPress += (sender, eventArgs) =>
                {
                    appShutdownService.RequestShutdown();
                    // Don't terminate the process immediately, wait for the Main thread to exit gracefully.
                    eventArgs.Cancel = true;
                };
                appShutdownService.ShutdownRequested.WaitHandle.WaitOne();
            }
        }
    }
}
https://github.com/aspnet/Hosting/blob/dev/src/Microsoft.AspNet.Hosting/Program.cs