【问题标题】:ASP.NET 5 / MVC 6 Console Hosted AppASP.NET 5 / MVC 6 控制台托管应用程序
【发布时间】:2015-07-07 02:03:53
【问题描述】:

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

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

【问题讨论】:

    标签: c# asp.net asp.net-mvc asp.net-core-mvc


    【解决方案1】:

    ...我有一个控制台应用程序,它将使用 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.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

    【讨论】:

    • 请务必注意,asp.net 4.x owin 托管仅适用于 webapi,如果您想自托管,例如 asp.net MVC 应用程序,它对您完全无用。跨度>
    【解决方案2】:

    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<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

    【讨论】:

    • 也许这个代码已经过时了?我对它有很大的困难。例如WebHostBuilder 似乎改变了它的构造函数。
    • 我可以在 ASP.NET MVC 5 中使用它吗? (非核心)
    猜你喜欢
    • 1970-01-01
    • 2014-07-01
    • 2011-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-12
    相关资源
    最近更新 更多