麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁(yè) > 學(xué)院 > 開發(fā)設(shè)計(jì) > 正文

OWIN 中 K Commands(OwinHost.exe)與 Microsoft.AspNet.Hosting 的角色問題

2019-11-17 01:58:38
字體:
供稿:網(wǎng)友

OWIN 中 K Commands(OwinHost.exe)與 Microsoft.aspNet.Hosting 的角色問題

問題詳情: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),先看一下它們的概念:

  • OwinHost.exe: While some will want to write a custom PRocess to run Katana Web applications, many would prefer to simply launch a pre-built executable that can start a server and run their application. For this scenario, the Katana component suite includes OwinHost.exe. When run from within a project’s root directory, this executable will start a server (it uses the HttpListener server by default) and use conventions to find and run the user’s startup class. For more granular control, the executable provides a number of additional command line parameters.
  • K Commands: Whenever you want to run your app in command line using K* commands, you will use k run. The K command is your entry point to the runtime. To run an application you can use K run to build you can use K build, and all other commands that are about taking your application and running it.
  • Microsoft.AspNet.Hosting: The Hosting repo contains code required to host an asp.net vNext application, it is the entry point used when self-hosting an application.

上面是從網(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)。


發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 国产三级国产精品国产普男人 | 欧美成人一区免费视频 | 日本aⅴ在线 | 羞羞的小视频 | av性色全交蜜桃成熟时 | 国产成人高清在线观看 | 久久久一区二区三区精品 | av在线免费看网站 | 欧美成人黄色片 | 亚洲午夜一区二区三区 | 午夜av男人的天堂 | 久久国产精品久久久久久电车 | 亚洲欧美日韩免费 | 99综合视频 | 国产一区免费视频 | 欧美女孩videos | 欧美日韩在线视频一区 | 国产精品高潮视频 | 国产精品视频免费网站 | 欧美巨根| 日本黄色一级电影 | 欧美一级毛片美99毛片 | 日日摸夜夜骑 | 日韩欧美精品电影 | 久久美女色视频 | 超级av在线 | 最新午夜综合福利视频 | 中文字幕国 | 久久久久久久爱 | av在线播放亚洲 | 99亚洲精品| 污片在线观看视频 | 国产噜噜噜噜久久久久久久久 | 欧美成在线视频 | 国产亲子伦在线观看 | 欧美成人一区免费视频 | 黄色片免费看网站 | 一起草av在线| 热99热| 精品久久中文网址 | 午夜a狂野欧美一区二区 |