ASP.NET Core框架深度学习(四)宿主对象
11、WebHost 第六个对象
到目前为止我们已经知道了由一个服务器和多个中间件构成的管道是如何完整针对请求的监听、接收、处理和最终响应的,接下来来讨论这样的管道是如何被构建出来的。管道是在作为应用宿主的WebHost对象启动的时候被构建出来的,在ASP.NET Core Mini中,我们将表示应用宿主的IWebHost接口简写成如下的形式:只包含一个StartAsync方法用来启动应用程序。
- public interface IWebHost
- {
- Task StartAsync();
- }
由于由WebHost构建的管道由Server和HttpHandler构成,我们在默认实现的WebHost类型中,我们直接提供者两个对象。在实现的StartAsync方法中,我么只需要将后者作为参数调用前者的StartAsync方法将服务器启动就可以了。
- public class WebHost : IWebHost
- {
- private readonly IServer _server;
- private readonly RequestDelegate _handler;
- public WebHost(IServer server, RequestDelegate handler)
- {
- _server = server;
- _handler = handler;
- }
- public Task StartAsync() => _server.StartAsync(_handler);
- }
12、WebHostBuilder 第七个对象
作为最后一个着重介绍的核心对象,WebHostBuilder的使命非常明确:就是创建作为应用宿主的WebHost。由于在创建WebHost的时候需要提供注册的服务器和由所有注册中间件构建而成的RequestDelegate,所以在对应接口IWebHostBuilder中,我们为它定义了三个核心方法。
- public interface IWebHostBuilder
- {
- IWebHostBuilder UseServer(IServer server);
- IWebHostBuilder Configure(Action<IApplicationBuilder> configure);
- IWebHost Build();
- }
除了用来创建WebHost的Build方法之外,我们提供了用来注册服务器的UseServer方法和用来注册中间件的Configure方法。Configure方法提供了一个类型为Action<IApplicationBuilder>的参数,意味着我们针对中间件的注册是利用上面介绍的IApplicationBuilder对象来完成的。
如下所示的WebHostBuilder是针对IWebHostBuilder接口的默认实现,它具有两个字段分别用来保存注册的中间件和调用Configure方法提供的Action<IApplicationBuilder>对象。当Build方法被调用之后,我们创建一个ApplicationBuilder对象(方法内部使用new ApplicationBuilder并添加相关配置),并将它作为参数调用这些Action<IApplicationBuilder>委托,进而将所有中间件全部注册到这个ApplicationBuilder对象上。我们最终调用它的Build方法得到由所有中间件共同构建的RequestDelegate对象,并利用它和注册的服务器构建作为应用宿主的WebHost对象。
- public class WebHostBuilder : IWebHostBuilder
- {
- private IServer _server;
- private readonly List<Action<IApplicationBuilder>> _configures = new List<Action<IApplicationBuilder>>();
- public IWebHostBuilder Configure(Action<IApplicationBuilder> configure)
- {
- _configures.Add(configure);
- return this;
- }
- public IWebHostBuilder UseServer(IServer server)
- {
- _server = server;
- return this;
- }
- public IWebHost Build()
- {
- var builder = new ApplicationBuilder();
- foreach (var configure in _configures)
- {
- configure(builder);
- }
- return new WebHost(_server, builder.Build());
- }
- }
13、回顾一下Hello World 2
到目前为止,我们已经将ASP.NET Core Mini涉及的七个核心对象介绍完了,然后我们再来回顾一下建立在这个模拟框架上的Hello World程序。
- public class Program
- {
- public static async Task Main()
- {
- await new WebHostBuilder()
- .UseHttpListener()
- .Configure(app => app
- .Use(FooMiddleware)
- .Use(BarMiddleware)
- .Use(BazMiddleware))
- .Build()
- .StartAsync();
- }
- public static RequestDelegate FooMiddleware(RequestDelegate next)
- => async context => {
- await context.Response.WriteAsync("Foo=>");
- await next(context);
- };
- public static RequestDelegate BarMiddleware(RequestDelegate next)
- => async context => {
- await context.Response.WriteAsync("Bar=>");
- await next(context);
- };
- public static RequestDelegate BazMiddleware(RequestDelegate next)
- => context => context.Response.WriteAsync("Baz");
- }
首选我们调用WebHostBuilder的扩展方法UseHttpListener采用如下的方式完成了针对HttpListenerServer的注册。由于中间件体现为一个Func<RequestDelegate, RequestDelegate>对象,我们自然可以采用与之具有相同声明的方法(FooMiddleware、BarMiddleware和BazMiddleware)来定义对应的中间件。中间件调用HttpResponse的WriteAsync以如下的方式将指定的字符串写入响应主体的输出流。
- public static partial class Extensions
- {
- public static IWebHostBuilder UseHttpListener(this IWebHostBuilder builder, params string[] urls)
- => builder.UseServer(new HttpListenerServer(urls));
- public static Task WriteAsync(this HttpResponse response, string contents)
- {
- var buffer = Encoding.UTF8.GetBytes(contents);
- return response.Body.WriteAsync(buffer, , buffer.Length);
- }
- }
ASP.NET Core Mini模拟了真实ASP.NET Core框架最核心的部分,即由服务器和中间件构成的请求处理管道。真正的ASP.NET Core框架自然要复杂得多得多,那么我们究竟遗漏了什么呢?
如上所示的5个部分是ASP.NET Core Mini没有涉及的,其中包括依赖注入、以Startup和StartupFilter的中间件注册方式、针对多种数据源的配置系统、诊断日志系统和一系列预定义的中间件,上述的每个方面都涉及到一个庞大的主题,我们将ASP.NET Core涉及到的方方面都写在我将要出版的《ASP.NET Core框架揭秘》中,如果你想全方面了解一个真实的ASP.NET Core框架,敬请期待新书出版。
ASP.NET Core框架深度学习(四)宿主对象的更多相关文章
- ASP.NET Core框架深度学习(一) Hello World
对于学习Core的框架,对我帮助最大的一篇文章是Artech的<200行代码,7个对象——让你了解ASP.NET Core框架的本质>,最近我又重新阅读了一遍该文.本系列文章就是结合我的阅 ...
- ASP.NET Core框架深度学习(二) 管道对象
4.HttpContext 第一个对象 我们的ASP.NET Core Mini由7个核心对象构建而成.第一个就是大家非常熟悉的HttpContext对象,它可以说是ASP.NET Core应用开发中 ...
- ASP.NET Core框架深度学习(三) Server对象
8.Server 第五个对象 服务器在管道中的职责非常明确,当我们启动应用宿主的WebHost的时候,服务它被自动启动.启动后的服务器会绑定到指定的端口进行请求监听,一旦有请求抵达,服务器会根据该 ...
- ASP.NET Core 框架本质学习
本文作为学习过程中的一个记录. 学习文章地址: https://www.cnblogs.com/artech/p/inside-asp-net-core-framework.html 一. ASP.N ...
- C#中的函数式编程:递归与纯函数(二) 学习ASP.NET Core Razor 编程系列四——Asp.Net Core Razor列表模板页面
C#中的函数式编程:递归与纯函数(二) 在序言中,我们提到函数式编程的两大特征:无副作用.函数是第一公民.现在,我们先来深入第一个特征:无副作用. 无副作用是通过引用透明(Referential ...
- 200行代码,7个对象——让你了解ASP.NET Core框架的本质
2019年1月19日,微软技术(苏州)俱乐部成立,我受邀在成立大会上作了一个名为<ASP.NET Core框架揭秘>的分享.在此次分享中,我按照ASP.NET Core自身的运行原理和设计 ...
- 了解ASP.NET Core框架的本质
了解ASP.NET Core框架的本质 ASP.NET Core自身的运行原理和设计思想创建了一个 “迷你版” 的ASP.NET Core框架,并且利用这个 “极简” 的模拟框架阐述了ASP.NET ...
- 200行代码,7个对象——让你了解ASP.NET Core框架的本质
原文:200行代码,7个对象--让你了解ASP.NET Core框架的本质 2019年1月19日,微软技术(苏州)俱乐部成立,我受邀在成立大会上作了一个名为<ASP.NET Core框架揭秘&g ...
- ASP.NET Core框架的本质
源文章地址:http://www.cnblogs.com/artech/p/inside-asp-net-core-framework.html 1.从Hello World谈起 当我们最开始学习一门 ...
随机推荐
- lxml导入
通常的导入方式 from lxml import etree python有自带的ElementTree库,但lxml在其基础上新增了特有的功能 如果代码仅使用ElementTree API,不依赖于 ...
- 关于@RequestBody 有的时候能接收有的时候接收不了的情况,@RequestParam什么时候使用
最近有点疑惑的是,在公司用@RequestBody 可以解析前端发送的json串,但是自己在做项目的时候老是会接受不到,报415错误,于是寻思了一下,看了看请求体有何不同,发现确实不同, 这个是表 ...
- IDEA乱码Tomcat控制台乱码输出乱码报文乱码
电脑重装系统后,重新安装了最新版的IDEA 2019.2.2,出现乱码.百度了很多,慢慢的解决了乱码的问题,现记录如下.方法因人而异,不同的问题不一样的方法. 第一 修改IDEA文件编码格式 设置id ...
- DDL--DML
DDL 数据定义语言 DDL是基于数据表级别的操作的统称,对数据表的 创建 删 改 删除 drop -- 删除表,记录日志 truncate -- 删除表中的全部数据,不删除表,不记录日志 修改 al ...
- SpringCloud中Feign的适配器的实现方案
前言 最近在做微服务的项目,各个系统之间需要进行调用,然后用一个适配器来实现服务之间的feign调用,使用适配器进行统一管理. 实现方案 首先我们需要将服务的名称进行单独的配置,可以方便的进行切换和扩 ...
- Java操作数据库——手动实现数据库连接池
Java操作数据库——手动实现数据库连接池 摘要:本文主要学习了如何手动实现一个数据库连接池,以及在这基础上的一些改进. 部分内容来自以下博客: https://blog.csdn.net/soonf ...
- Unity3D_Transform_位置、角度、缩放及其他
1.位置 transforn.position 世界位置 transform.localPosition 相对父类位置 在屏幕左上方显示方法: private void OnGUI() { GUIL ...
- 【Gradle】Android Gradle 插件
Android Gradle 插件 Android Gradle 插件简介 从Gradle角度来看,Android其实是Gradle的一个第三方插件,它是由Google的Android团队开发的.但从 ...
- ABP入门教程1 - 开篇
点这里进入ABP入门教程目录 基于DDD的现代ASP.NET开发框架 - ABP ABP是“ASP.NET Boilerplate Project (ASP.NET样板项目)”的简称. ASP.NET ...
- C#后台架构师成长之路-高阶知识体系核心
了解了这些东西,熟悉了运用基本都是高工级别的了,其他修修补补就行了.... 1.三种预定义特性:attributeUsage.Conditional.obsolete,允许创建自定义特性,派生自Sys ...