2015-07-07 7 views
2

В MVC5 у меня было консольное приложение, которое будет использовать Microsoft.Owin.Hosting.WebApp.Start (...) для размещения кучи контроллеров, которые будут динамически загружаться из сборок, размещенных во внешней папке и запускающих некоторые пользовательские инициализации с помощью вызова API. Таким образом, я мог передавать параметры методу инициализации, которые были определены во время выполнения (и не были бы такими же неудобными, как и поддержка файлов конфигурации).ASP.NET 5/MVC 6 Console Hosted App

В MVC6 самообслуживание теперь выполняется, насколько мне известно, во время выполнения DNX с использованием Microsoft.AspNet.Hosting, но все это делается через командную строку. Есть ли способ, которым я могу самостоятельно запускать приложение в консоли C#, чтобы сохранить эту архитектуру инициализации?

ответ

4

Статический класс Katana's 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) и запустить его с помощью 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

+0

Может быть, этот код датирована? Мне с этим сложно справиться. Например, 'WebHostBuilder', похоже, изменил свои конструкторы. – Philippe

5

... у меня было консольное приложение, которое будет использовать Microsoft.Owin.Hosting.WebApp.Start (...) для размещения [и] передать параметры метод инициализации, который был определен в runt IME ...

В ASP.NET 4.x мы самостоятельный хозяин в консольном приложении с использованием хоста Owin. Мы напрямую управляем нашим MyApp.exe. Его метод Main() вызывает WebApp.Start() для создания хоста OWIN. Мы используем экземпляр IAppBuilder, чтобы построить HTTP-конвейер через appBuilder.Use() и связать все это вместе с appBuilder.Build(). Все это находится в пространстве имен Microsoft.Owin.Hosting.

Есть ли способ, которым я могу самостоятельно управлять из приложения консоли C#, чтобы сохранить эту архитектуру инициализации?

В ASP.NET Core RC2 мы самостоятельного хозяина внутри консольного приложения с использованием IWebHost. (Это не хост OWIN, хотя OWIN вдохновил его.) Мы запускаем наш MyApp.exe напрямую. Метод Main() создает новый 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 равен 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

+1

Важно отметить, что хостинг asp.net 4.x owin работает только для webapi, что делает его совершенно бесполезным для вас, если вы хотите, чтобы он был сам, скажем, приложение ASP.NET ASP.NET. –

Смежные вопросы