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#控制台应用程序中自托管,这样我就可以保持这个初始化架构?
…我有一个控制台应用程序,它将使用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.exe
。Main()
方法创建一个新的WebHostBuilder()
,我们使用它通过webHostBuilder.Use()
构建HTTP管道,将其与webHostBuilder.Build()
链接在一起。这些都在Microsoft.AspNet.Hosting
命名空间内。
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