問題詳情:K Commands(OwinHost.exe)是不是 OWIN 中的 Host 角色?如果是,那 Microsoft.AspNet.Hosting 對(duì)應(yīng)的是 OWIN 中的哪個(gè)角色?
OWIN 中,除了 Host 和 Server 的概念容易混淆,K Commands(OwinHost.exe)與 Microsoft.AspNet.Hosting 也是很容易混淆的一點(diǎn),先看一下它們的概念:
上面是從網(wǎng)上各個(gè)地方搜刮的概念,再來結(jié)合 Microsoft.AspNet.Hosting/Program.cs 的源碼:
using System;using System.IO;using System.Threading;using System.Threading.Tasks;using Microsoft.Framework.ConfigurationModel;using Microsoft.Framework.DependencyInjection;using Microsoft.Framework.DependencyInjection.Fallback;using Microsoft.Framework.Logging;using Microsoft.Framework.Runtime;namespace Microsoft.AspNet.Hosting{ public class Program { private const string HostingIniFile = "Microsoft.AspNet.Hosting.ini"; private readonly IServiceProvider _serviceProvider; public Program(IServiceProvider serviceProvider) { _serviceProvider = serviceProvider; } public void Main(string[] args) { var config = new Configuration(); if (File.Exists(HostingIniFile)) { config.AddIniFile(HostingIniFile); } config.AddEnvironmentVariables(); config.AddCommandLine(args); var services = HostingServices.Create(_serviceProvider, config) .BuildServiceProvider(); var appEnv = services.GetRequiredService<IApplicationEnvironment>(); var hostingEnv = services.GetRequiredService<IHostingEnvironment>(); var context = new HostingContext() { Services = services, Configuration = config, ServerName = config.Get("server"), // TODO: Key names ApplicationName = config.Get("app") // TODO: Key names ?? appEnv.ApplicationName, EnvironmentName = hostingEnv.EnvironmentName, }; var engine = services.GetRequiredService<IHostingEngine>(); var loggerFactory = services.GetRequiredService<ILoggerFactory>(); var appShutdownService = _serviceProvider.GetRequiredService<IApplicationShutdown>(); var shutdownHandle = new ManualResetEvent(false); var serverShutdown = engine.Start(context); appShutdownService.ShutdownRequested.Register(() => { try { serverShutdown.Dispose(); } catch (Exception ex) { var logger = loggerFactory.Create<Program>(); logger.WriteError("TODO: Dispose threw an exception", ex); } shutdownHandle.Set(); }); var ignored = Task.Run(() => { Console.WriteLine("Started"); Console.ReadLine(); appShutdownService.RequestShutdown(); }); shutdownHandle.WaitOne(); } }}
K Commands(OwinHost.exe)的作用就是啟動(dòng)并加載 OWIN 組件,使你的應(yīng)用程序處于運(yùn)行狀態(tài),看上面 Program.cs 代碼,就會(huì)發(fā)現(xiàn) Microsoft.AspNet.Hosting 其實(shí)就是一個(gè)控制臺(tái)項(xiàng)目,當(dāng)然除此之外還會(huì)包含 Builder、Server、Startup 等一些操作,這些構(gòu)成了基本的 OWIN Host,它是一個(gè)進(jìn)程,負(fù)責(zé)啟動(dòng)并加載 OWIN 組件(在之前的博文中有說明),而 K Commands(OwinHost.exe)只不過是一個(gè)命令,用來去開啟它,就像一個(gè)車鑰匙,用來發(fā)動(dòng)汽車一樣。結(jié)合 IIS 的一些東西,K Commands(OwinHost.exe)就像我們點(diǎn)擊“啟動(dòng)”、“停止” 的后臺(tái)處理命令,當(dāng)然還有一些 URL 綁定等,這些都通過命令去加載,過程大概是這樣:K Commands -> project.json -> Microsoft.AspNet.Hosting -> Started。
在之前曾說過,如果采用 IIS 的部署,那 ASP.NET 5 的 project.json 配置,就是下面這么簡(jiǎn)單:
{ "webroot": "wwwroot", "dependencies": { "Microsoft.AspNet.Server.IIS": "1.0.0-beta1" }}
你會(huì)發(fā)現(xiàn),沒有了 Microsoft.AspNet.Hosting、Microsoft.AspNet.Server.WebListener,也沒有了 Commands,為什么呢?因?yàn)?IIS 既是 Host,又是 Server,IIS 與 ASP.NET 5 的 OWIN 管道處理,是通過 Microsoft.AspNet.Server.IIS(AspNet.Loader.dll)打通的,所以 OWIN 的處理組件都是通過 IIS,這時(shí)候的 ASP.NET 5 其實(shí)就不是純粹的 OWIN。
回答上面的問題,K Commands(OwinHost.exe)不是 OWIN 中的 Host 角色,Microsoft.AspNet.Hosting 才是,應(yīng)該準(zhǔn)確的說,K Commands(OwinHost.exe)和 OWIN 中的 Host 不存在概念問題,它只是一個(gè)命令,用來開啟 Microsoft.AspNet.Hosting,Microsoft.AspNet.Hosting 是 OWIN 中 Host 概念的具體體現(xiàn)。
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注