我心中的ASP.NET Core 新核心对象WebHost(一)

以本系列文章向Fish 前辈的那篇我心中的ASP.NET 核心对象致敬。(虽然不知道前辈现在在干什么)。一晃就6年过去了,那首 郝云 的《回到那一天》怎么唱来着? 时光一晃,你就三十了。

而我们都变成了老了的程序员 

 

ASP.NET Core在解开了对windows的依懒之后,整个管线都发生了变化 。这个变化是彻底的,原来ASP.NET 中的有些对象直接没有了。被保留下来的,也只是你看起来还差不多,但实现已经完全不一样了。

 

我们就来说说我认为的这些ASP.NET Core的这些新的核心对象。

WebHost, IServiceCollection,IServiceProvider,IApplicationBuilder,IMiddleware 和 RequestDelegate, IServer和IHttpApplication

还有一些同样很重要的对象: ILogger, IConfiguration 

始于WebHost

WebHost像母亲,它承载和孕育了ASP.NET Core下几乎所有的对象,从代码层面入手来看的话可以说是ASP.NET Core的入口,没有它,后面的一切都没有办法开始。当然如何复杂的一项业务,要做好也不容易,WebHost的启动一共分为四阶段。

  • 准备阶段: var builder = new WebHostBuilder(),然后给WebHostBuilder各种填参数

  • 构建阶段: var host = builder.Builder() , 主要负责依懒注入的初始化,以及host的初始化

  • 启动阶段: host.start(); 

  • 运行阶段

program.cs

ASP.NET Core 程序基于一个命令行的程序运行,程序的入口在program.cs的main方法。

public static void Main(string[] args){WebHost.CreateDefaultBuilder(args).UseStartup<Startup>().Build().Run();
}

WebHost是一个internal类,我相信NETCore团队不希望大家随意的去new它,而是通过WebHostBuilder去构建。我们在这里访问的WebHost实际上不是真正的WebHost,真正的WebHost在github的Hosting项目下,命名空间为:Microsoft.AspNetCore.Hosting.Internal。

在ASP.NET Core1x中,我们必须要自己创建WebHostBuilder。

var host = new WebHostBuilder().UseKestrel().UseContentRoot(Directory.GetCurrentDirectory()).UseIISIntegration().UseStartup<Startup>().Build();

这些默认的动作未免有些繁琐,后来到了ASP.NET Core2的时候创建了一个新的项目在github上,叫做MetaPackages 并在 Microsoft.AspNetCore的命名空间下创建了一个static class也就是我们现在用到的这个,里面主要的方法就是CreateDefaultBuilder。

CreateDefaultBuilder方法

这个方法负责返回给我们一个WebHostBuilder, 并且调用了以下扩展方法:

  • UseKestrel 使用kestrel server来处理请求

  • UseContentRoot 设置站点目录 

  • ConfigureAppConfiguration

  • ConfigureLogging

其实和我们在1X的时候自己构建是一个道理,而这些都是基于WebHostBuilder 的扩展方法它们来自于其它几个不同的组件。

UseKestrel

WebHost负责托管ASP.NET Core,但是它并不真正从服务器网卡上监听端口以及将网络字节转换到.net core的管道。这些由IServer来处理。

这里先简单了解一下这个过程,我们后面会在IServer的环节再详述。我们这里使用的UseKestrel 来自于github上的项目 KestrelHttpServer。

里面的Kestrel项目下有一个WebHostBuilderKestrelExtensions类。里面就是这个 UseKestrel扩展方法的定义:

public static IWebHostBuilder UseKestrel(    this IWebHostBuilder hostBuilder){    return hostBuilder.ConfigureServices(services =>{    // Don't override an already-configured transportservices.TryAddSingleton<ITransportFactory, SocketTransportFactory>();services.AddTransient<IConfigureOptions<KestrelServerOptions>, KestrelServerOptionsSetup>();services.AddSingleton<IServer, KestrelServer>();});
}

其实也很简单,都是在进行Server依赖的配置,因为最终的执行都由WebHost来展控。所以WebHost大量依赖的其它外部组件都被定义成接口放到了HttpAbstractions里面,然后由外部扩展方法(多以Use开头,进行配置)

ASP.NET Core源码里面大量使用扩展方法进行Servier DI的配置,扩展方法定义在各种不同的命名空间以及项目下。如果不习惯或者不了解相关的部分会觉得有些痛苦。

ConfigureAppConfiguration

这个方法专门用来为 WebHostBuilder添加配置,包括appsettings.json的、命令行参数以及环境变量。关于配置这一节我们留在后面具体来讲。

config.AddJsonFile(       
      "appsettings.json", optional: true, reloadOnChange: true) .AddJsonFile(
$"appsettings.{env.EnvironmentName}.json", optional: true, reloadOnChange: true);config.AddEnvironmentVariables();config.AddCommandLine(args);

ConfigureLogging

logging也是 ASP.NET Core内置组件中的很重要一个,这个方法在默认已经为我们添加了appsettings中的logging配置以及控制台log。关于日志这一节我们留在后面具体来讲。

logging.AddConfiguration(        hostingContext.Configuration.GetSection("Logging"));logging.AddConsole();
logging.AddDebug();

UseStartup<>

Startup.cs这个类主要做两件事情的配置Service DI和http管道,这些都是在WebHost启动之前就需要确定下来的。而UseStartup就是将我们定义的Startup.cs和 IStartup绑定起来,让WebHost可以找得到。 怎么绑定呢? 当然还是依赖注入:

 if (typeof(IStartup).GetTypeInfo().IsAssignableFrom(startupType.GetTypeInfo()))
{services.AddSingleton(typeof(IStartup), startupType);
}
else{services.AddSingleton(typeof(IStartup), sp =>{    var hostingEnvironment = sp.GetRequiredService<IHostingEnvironment>();  
 return new ConventionBasedStartup(StartupLoader.LoadMethods(sp, startupType, hostingEnvironment.EnvironmentName));}); }

VS为我们添加的Startup.cs默认不继续IStartup接口,所以是采用Convention的这种方式,当然我们也可以继承IStartup则直接注册成单例到应用程序。

以上是整个 WebHostBuilder的准备阶段,即往里面放了很多的参数。下一篇我们将接着讲Builder阶段,给了你那么多,你要开始制造点什么东西给我了

原文地址:http://www.jessetalk.cn/2017/11/11/aspnet-core-object-webhost/


.NET社区新闻,深度好文,欢迎访问公众号文章汇总 http://www.csharpkit.com


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/322937.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Hadoop入门(二十四)Mapreduce的求TopK程序

一、简介 求TopK是算法中最常使用到的&#xff0c;现在使用Mapreduce在海量数据中统计数据的求TopK。 二、例子 &#xff08;1&#xff09;实例描述 给出三个文件&#xff0c;每个文件中都存储了若干个数值&#xff0c;求所有数值中的求Top 5。 样例输入&#xff1a; …

DML、DDl、DQL实战

表的创建与删除 create table 学生成绩( id int primary key, name char(10) not null, sex char(10) not null, 物理 int not null, 语文 int not null, 英语 int not null, 数学 int )DEFAULT CHARSETutf8mb4; drop table 学生成绩; DML 数据操纵语言DML主要有三种形式&a…

Scaffolding Template on Asp.Net Core Razor Page

Scaffolding Template Intro 我们知道在Asp.Net MVC中&#xff0c;如果你使用的EF的DBContext的话&#xff0c;你可以在vs中通过右键解决方案-添加控制器-添加包含视图的控制器&#xff0c;然后vs会根据你选择的Model自动生成相应的CURD的控制器和View&#xff0c;非常便利&…

jzoj3895-数字对【RMQ,GCD,二分答案,单调队列】

正题 题目大意 一个序列aaa 对于[L..R][L..R][L..R]若ak∈[L..R]∣ai∈[L..R]a_k \in [L..R]|a_i\in[L..R]ak​∈[L..R]∣ai​∈[L..R]则这个一个特殊区间。 求最长特殊区间。 解题思路 先RMQRMQRMQ求区间GCDGCDGCD&#xff0c;然后二分答案。 之后aka_kak​肯定是这个区间最…

Hadoop生态hive(一)介绍

一、Hive是什么 起源自facebook由Jeff Hammerbacher领导的团队&#xff0c;构建在Hadoop上的数据仓库框架。设计目的是让SQL技能良好&#xff0c;但Java技能较弱的分析师可以查询海量数据。2008年facebook把hive项目贡献给Apache。 由facebook开源&#xff0c;最初用于解决海量…

jzoj3896-战争游戏【tarjan,割点,点双联通分量】

正题 题目大意 求每个点是多少个点对之间路径的必经点。 解题思路 首先若一个点是在点不是割点&#xff0c;那么答案就是n−1n-1n−1&#xff0c;因为这个点不是除了它自己以为任何点对的必经点。 之后我们记录每个可以割掉的联通分量的大小。对于一个割点&#xff0c;是两种…

使用混合云的SQL Server

近期发布的Microsoft SQL Server 2017&#xff0c;表明Microsoft公司正寻求不断降低其所交付的工具对平台的绑定。在SQL Server 2017中&#xff0c;这一趋势可以从“混合云”&#xff08;Hybrid Cloud&#xff09;术语和多平台本质这两个方面得以证实。下面让我们分别一窥这两个…

Hadoop生态hive(二)安装

一、安装模式 内嵌模式&#xff1a;元数据保持在内嵌的Derby模式&#xff0c;只允许一个会话连接 本地独立模式&#xff1a;在本地安装Mysql&#xff0c;把元数据放到Mysql内 远程模式&#xff1a;元数据放置在远程的Mysql数据库 官方文档&#xff1a; https://cwiki.apac…

.NET Core多平台项目模板eShopOnContainers编译手记

之前写了一个功能性的文件上传asp.net core的小程序&#xff0c;加上点七七八八的东西&#xff0c;勉强能够应付了&#xff0c;打算学习一下微软的官方.NET CORE微服务示例https://github.com/dotnet-architecture/eShopOnContainers。这个例子很全面地展现了微服务、docker以及…

欢乐纪中某B组赛【2019.1.25】

前言 还算OKOKOK 成绩 RankRankRank是有算别人的 RankRankRankPersonPersonPersonScoreScoreScoreAAABBBCCC4442017myself2017myself2017myself1801801801001001008080800005552017zyc2017zyc2017zyc1601601606060601001001000001111112017hzb2017hzb2017hzb14014014060606080…

如何改变Idea的背景

进入Idea 按下ctrlshifta 点击set background 选择自己准备好的图片地址&#xff0c;就可以更改背景了 更改后效果 关于接口的插件 GsonFormat插件 安装还是和别的插件一样&#xff0c;在plugin里搜索GsonFormat&#xff0c;下载并重启 然后在model里的类 按下alts 出现 将…

jzoj1252,P5194-天平【dfs,set】

正题 题目大意 nnn个砝码&#xff0c;选择若干个要求重量不超过ccc的情况下最重。 解题思路 拆成两部分来dfsdfsdfs&#xff0c;第一部分将答案加入setsetset。 第二部分对于每个答案在setsetset中查询。 时间复杂度O(2n2logn)O(2^{\frac{n}{2}}\ log\ n)O(22n​ log n) cod…

包依赖

thymeleaf <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-thymeleaf</artifactId></dependency>

TFS在项目中Devops落地进程(上)

作为一名开发,经过近2年折腾,基于TFS的Devops主线工程大体落地完毕。 在此大体回忆下中间的各种历程。 开始之前简单说下什么是TFS(Team Foundation Server)。 TFS是微软推出的一款ALM&#xff08;Application Lifecycle Management)管理工具。 透过TFS你将能获取到从代码版本管…

Hadoop生态hive(三)Hive QL介绍

一、表 创建表 CREATE [EXTERNAL] TABLE [IF NOT EXISTS] table_name CREATE TABLE 创建一个指定名字的表。Hive 创建内部表时&#xff0c;会将数据移动到数据仓库指向的路径&#xff1b; EXTERNAL 关键字可以让用户创建一个外部表&#xff0c;在建表的同时指定一个指向实…

抖音上非常火的旋转图快速部署

本教程不需要你有服务器&#xff01; 本教程不需要你有服务器&#xff01; 本教程不需要你有服务器&#xff01; 点击我看旋转图 总共两步 1、注册一个码云账号 2、新建一个仓库&#xff0c;上传文件即可 1、注册账号的话&#xff0c;直接浏览器搜索码云&#xff0c;手机号…

hive命令出现问题Failed with exception Java.io.IOException:java.lang.IllegalArgumentException: java.NET.URI

转载自 hive命令出现问题Failed with exception Java.io.IOException:java.lang.IllegalArgumentException: java.NET.URI 一&#xff0c;问题描述&#xff1a;    登录到hive数据仓库后&#xff0c;输入一些命令&#xff0c;例如&#xff08;show databases &#xff0c…

Microsoft的现代数据管理

PASS 2017峰会是面向SQL Server及Microsoft相关数据技术用户的大会。在大会的第一天&#xff0c;Microsoft的Rohan Kumar先生到场做了开幕式的主题演讲&#xff0c;并借此机会展示了Microsoft在SQL Server和Azure数据库方面的最新进展。 Kumar的演讲涉及数据、人工智能和云这三…

jzoj1274-游历的路线【分层图,SPFA】

正题 题目大意 nnn个点每个点之间的边权是一个周期。 求从111出发经过mmm条边到nnn的最小权值 解题思路 分成mmm层表示天数&#xff0c;然后连边跑SPFASPFASPFA codecodecode #include<cstdio> #include<queue> #include<cstring> #define N 40100 using …

vue 3.4x以上如何改变项目运行端口号

我用3.4版本的vue-cli构建了一个vue项目&#xff0c;然后我想修改项目运行之后的访问端口 在网上查了一下&#xff0c;很多都是2.0的版本&#xff0c;查来查去都说是什么在 config目录下index.js文件中修改端口号。。。。。。。 都抄来抄去的 新的vue项目目录结构下并没有con…