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

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

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

Katana的WebApp静态类已被WebHostBuilder取代,它提供了一种更灵活的方法: https : //github.com/aspnet/Hosting/blob/dev/src/Microsoft.AspNet.Hosting/WebHostBuilder.cs 。

您可能已经使用过这个API而没有意识到它,因为它是您在project.json中注册新的web命令时托管块使用的组件(例如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().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(); 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

…我有一个控制台应用程序,它将使用Microsoft.Owin.Hosting.WebApp.Start(…)来托管[并]将参数传递给在运行时确定的初始化方法…

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

有没有办法可以在C#控制台应用程序中自我托管,这样我就可以保留这种初始化架构?

在ASP.NET Core rc2中,我们使用IWebHost在控制台应用程序中自托管。 (虽然OWIN启发了它,但这不是OWIN主机。)我们直接运行MyApp.exeMain()方法创建一个新的WebHostBuilder() ,我们使用它来通过webHostBuilder.Use()构建HTTP管道, webHostBuilder.Use()它与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