我心中的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
我心中的ASP.NET Core 新核心对象WebHost(一)相关推荐
- 我心中的ASP.NET Core 新核心对象WebHost(二)
这是ASP.NET Core新核心对象系列的第二篇,上一篇 WebHost准备阶段 我们讲到了WebHostBuilder的初始化及配置.我们给WebHostBuilder进行以下配置 UseKest ...
- ASP.NET Core 新核心对象WebHost(一)
以本系列文章向Fish 前辈的那篇我心中的ASP.NET 核心对象致敬.(虽然不知道前辈现在在干什么).一晃就6年过去了,那首 郝云 的<回到那一天>怎么唱来着? 时光一晃,你就三十了. ...
- asp.net core新特性(1):TagHelper
进步,才是人应该有的现象.-- 雨果 今天开始,我就来说说asp.net core的新特性,今天就说说TagHelper标签助手.虽然学习.net,最有帮助的就是microsoft的官方说明文档了,里 ...
- ASP.NET Core快速入门(第4章:ASP.NET Core HTTP介绍)--学习笔记
点击蓝字关注我们 课程链接:http://video.jessetalk.cn/course/explore 良心课程,大家一起来学习哈! 任务22:课程介绍 1.HTTP 处理过程 2.WebHos ...
- 送福利 | 送书3本 ASP.NET Core 真机拆解
小编:最近.NET相关图书在多年沉寂后重新恢复,本书作者提供3本送给公众号粉丝,所以参与方式:文章下方留言,你可以聊聊.NET Core 这几年的发展给你的印象,你的感想,点赞最多的前5位获奖. 活动 ...
- 一个迷你ASP.NET Core框架的实现(下)
[框架内幕]| 作者 / Edison Zhou 这是恰童鞋骚年的第196篇原创文章 上一篇我们了解了AspNetCore.Mini这个项目的背景及项目结构和流程,这一篇我们继续解析几个核心对象.本文 ...
- 《ASP.NET Core 微服务实战》-- 读书笔记(第1章 、第2章)
译者序 微服务设计方法清晰定义了各个开发团队的业务边界,微服务框架以不同方式实现了服务之间的协作与集成. .NET Core 作为全新的 .NET 技术,它不仅完全开源.跨平台,更面向云原生开发进行了 ...
- 从明面上学习ASP.NET Core
一.前言 这篇文章就是从能看到地方去学习Core,没有很深奥,也没有很难懂,现在我们开始吧. 二.构建项目,引发思考 创建项目的步骤真的很简单,你要是不会,我真也没法了,我这是创建的M ...
- ASP.NET Core依赖注入深入讨论
这篇文章我们来深入探讨ASP.NET Core.MVC Core中的依赖注入,我们将示范几乎所有可能的操作把依赖项注入到组件中. 依赖注入是ASP.NET Core的核心,它能让您应用程序中的组件增强 ...
最新文章
- EntityFrameworkCore 安装
- php如何实现省市,PHP简单实现正则匹配省市区的方法
- Vue.js生命周期
- 教你如何做一次真正有价值的业务数据分析
- matlab mysvd代码解释,关于使用SVD进行PCA主成分提取的代码问题!也是必须涉及到原理的!...
- ICPC North Central NA Contest 2017 E - Is-A? Has-A? Who Knowz-A?
- linux 停止路由转发策略_Linux静态路由
- 富士通Fujitsu DPK2089K 打印机驱动
- 优秀流程图和逻辑图画法的分析和借鉴
- 仿Tumblr点赞心破碎动画
- Java中如何判断一个集合中的一个元素不在另一个集合中?把不存在的元素移除
- uni-app uni-fab修改图标 浮窗位置 是否展开
- IdentityServer4 (IDS4) 快速入门
- 华为鲲鹏是芯片还是服务器,关于芯片:眼见为实华为鲲鹏架构服务器生态大揭秘...
- python axis到底如何理解?
- 七牛云存储详细配置步骤
- minikube addons enable ingress 启动错误
- ps多边形套索工具按过delete以后点下一个点点不出来
- 中国移动规范学习——4A技术要求(账号管理)
- 计算机应用稿件改后重审,论文投稿,外审意见是修后再审,修后再审过后,编辑告诉我要再修改然后再审,返回来的稿件是我修后的原稿,这是什么情况。求知道的专家同仁指点迷津...