在MVC5中,我有一个控制台应用程序,它将使用Microsoft.Owin.Hosting.WebApp.Start(...)来托管一堆控制器,这些控制器将从放置在外部文件夹中的程序集动态加载并运行一些自定义通过API调用初始化它们。这样我就可以将参数传递给在运行时确定的初始化方法(并且不像维护配置文件那样笨重)。
在MVC6中,据我所知,自我托管由DNX运行时使用Microsoft.AspNet.Hosting完成,但这都是通过命令行完成的。有没有办法可以在C#控制台应用程序中自我托管,这样我就可以保留这种初始化架构了?
答案 0 :(得分:5)
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
)并使用{{ 1}}(例如dnx
):
dnx . web
https://github.com/aspnet/Hosting/blob/dev/src/Microsoft.AspNet.Hosting/Program.cs
答案 1 :(得分:5)
...我有一个控制台应用程序,它将使用Microsoft.Owin.Hosting.WebApp.Start(...)来托管[并]将参数传递给在运行时确定的初始化方法...
在ASP.NET 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.exe
。 Main()
方法会创建一个新的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