Nat*_*ong 3 c# asp.net asp.net-mvc asp.net-core-mvc
在MVC5中,我有一个控制台应用程序,它将使用Microsoft.Owin.Hosting.WebApp.Start(...)来托管一堆控制器,这些控制器将从放置在外部文件夹中的程序集动态加载并对它们运行一些自定义初始化通过API调用.这样我就可以将参数传递给在运行时确定的初始化方法(并且不像维护配置文件那样笨重).
在MVC6中,据我所知,自我托管由DNX运行时使用Microsoft.AspNet.Hosting完成,但这都是通过命令行完成的.有没有办法可以在C#控制台应用程序中自我托管,这样我就可以保留这种初始化架构?
...我有一个控制台应用程序,它将使用Microsoft.Owin.Hosting.WebApp.Start(...)来托管[并]将参数传递给在运行时确定的初始化方法...
在ASP.NET 4.x中,我们使用OWIN主机在控制台应用程序中自托管.我们MyApp.exe直接经营.它的Main()方法调用WebApp.Start()创建OWIN主机.我们使用an的实例IAppBuilder来构建HTTP管道,appBuilder.Use()并将它们全部链接起来appBuilder.Build().这都在Microsoft.Owin.Hosting命名空间内.
有没有办法可以在C#控制台应用程序中自我托管,这样我就可以保留这种初始化架构?
在ASP.NET Core rc2中,我们使用一个控制台应用程序在托管应用程序中自托管IWebHost.(虽然OWIN启发了它,但这不是OWIN主机.)我们MyApp.exe直接运行.该Main()方法创建了一个new WebHostBuilder(),我们用它来构建HTTP管道webHostBuilder.Use(),将它们链接在一起webHostBuilder.Build().这都在Microsoft.AspNet.Hosting命名空间内.
关于Pinpoint的答案,在ASP.NET Core rc1中我们需要运行dnx.exe而不是直接运行我们的应用程序.的工作WebHostBuilder是藏在里面dnx.exe的可执行文件.Dnx.exe也启动我们的应用程序.我们的应用程序的Main()方法调用WebApplication.Run(),之后我们使用一个实例IApplicationBuilder通过调用将中间件添加到HTTP管道appBuilder.Use().我们的应用程序和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()
Run Code Online (Sandbox Code Playgroud)
一些参考文献
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
Katana的WebApp静态类已经被替换为WebHostBuilder,它提供了一种更灵活的方法:https://github.com/aspnet/Hosting/blob/dev/src/Microsoft.AspNet.Hosting/WebHostBuilder.cs.
您可能已经使用过这个API而没有意识到它,因为它是您在project.json(例如Microsoft.AspNet.Hosting server=Microsoft.AspNet.Server.WebListener server.urls=http://localhost:54540)中注册新的web命令并使用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();
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
https://github.com/aspnet/Hosting/blob/dev/src/Microsoft.AspNet.Hosting/Program.cs