ASP.NET Core管道深度剖析(1):采用管道处理HTTP请求

之所以称ASP.NET Core是一个Web开发平台,源于它具有一个极具扩展性的请求处理管道,我们可以通过这个管道的定制来满足各种场景下的HTTP处理需求。ASP. NET Core应用的很多特性,比如路由、认证、会话、缓存等,也同时定制消息处理管道来实现的。我们甚至可以通过管道定制在ASP.NET Core平台上创建我们自己的Web框架,实际上MVC和SingalR这两个重要的Web框架也是采用这样的方式创建的。

HTTP协议自身的特性决定了任何一个Web应用的工作方式都是监听、接收并处理HTTP请求,并在最终对请求予以响应,HTTP请求处理是管道式设计典型的应用场景。我们根据HTTP请求的处理流程定制出一个消息处理管道,让接收到的HTTP请求消息想水一样流入这个管道,组成这个管道的各个环节一次对它作相应的处理。处理的结果同样转变成消息逆向流入这个管道进行处理,并最终转变成回复给客户端的HTTP响应。ASP.NET Core的消息处理管道从设计的角度来讲是非常简单的,但是从具体实现的角度则相对难以理解,为了让读者朋友们通过本章对此具有深刻的理解,我们从简单的部分讲起。

一、从Hello World说起

为了使读者朋友们能够以最直观的感受认识ASP.NET Core的消息处理管道,我们来创建一个最简单的Hello World程序。这是一个仅仅由两个类型构成的控制台程序,作为程序入口的Main方法定义在Program类中,Startup则作为初始化类型。这个程序被启动之后将会绑定到默认端口5000进行HTTP请求的监听,任何针对基地址 “http://localhost:5000/” 的请求后,该程序都将响应 “Hello World” 。

   1: class Program
   2: {
   3:     static void Main(string[] args)
   4:     {
   5:         new WebHostBuilder()
   6:             .UseKestrel()
   7:             .UseStartup<Startup>
   8:             .Build()
   9:             .Start();
  10:     }
  11: }
  12:  
  13:  
  14: public class Startup
  15: {
  16:     public void Configure(IApplicationBuilder app)
  17:     {
  18:         app.Run(context=>context.Response.WriteAsync("Hello World");
  19:     }
  20: }

这个程序涉及到一个重要的对象WebHost,它通过WebHostBuilder的Build方法创建。WebHost可以看成是Web应用的宿主,启动Web应用本质上就是启动它的宿主。当我们调用WebHost的Start方法启动应用的时候,用于监听、接收、处理和响应HTTP请求的消息处理管道随之被建立。那么在这个过程中,通过调用UseStartup<T>方法注册到WebHostBuilder上的初始化类型将用来对这个管道进行定制。总的来说,ASP.NET Core的请求处理管道由WebHost在启动的时候构建,WebHostBuilder则是后者的创建者,右图揭示了三者之间的关系。clip_image002

二、管道的构成

HTTP请求处理流程始于对请求的监听与接收,终于对请求的响应,这两项工作由同一个对象来完成,我们称之为 “服务器(Server)” ,尽管ASP.NET Core的请求处理管道可以被自由地订制,但是该管道必须有一个服务器,服务器是整个管道的 “龙头” 。在上面的这个Hello World应用中,在调用WebHostBuilder的Build方法创建一个WebHost之前,我们调用了它的一个扩展方法UseKestrel,这个方法的作用就是为后续构建的管道注册一个名为KestrelServer的服务器。

7-2

随着WebHost的Start方法的调用,按照具体需求进行定制的请求处理管道被构建出来,作为第一个节点的服务器会绑定到一个预设的端口(比如KestrelServer默认采用5000作为监听端口)开始监听来自客户端的HTTP请求。一旦请求抵达,服务器会接收请求并将其标准化后向管道后续的节点进行转发,我们将管道中位于服务器之后的请求处理节点成为“中间件(Middleware)”。每个中间件都具有各自独立的功能,比如我们有专门实现路由功能的中间件,由专门实施用户认证的中间,所谓的对请求处理管道的定制体现在根据具体的需求选择对应的中间件组成最终处理请求的管道。左图揭示了由一个服务器和一组中间件构成的请求处理管道。

clip_image006

一个建立在ASP.NET Core之上的应用一般都是根据某个框架开发的,开发框架基本上是建立在某个特殊的中间件上。以ASP.NET Core MVC这个最著名的框架为例,它实际上是利用一个叫做 “路由” 的中间件实现了请求地址与Controller/Action之间的映射,并在此基础实现了激活Controller、执行Action以及呈现View等一系列的功能。所以应用程序可以视为某个中间件的一部分,如果一定要将它独立出来,整个请求处理管道将呈现出如右图所示的结构。

三、管道的定制

在演示的Hello World程序中,我们在调用WebHostBuilder的Build方法创建WebHost之前先调用了它的扩展方法UseStartup<T>方法注册了一个类型为Startup的启动类型。从请求处理管道的角度来讲,注册的这个启动类型的目的在于对构建的管道进行定制,说得更加具体一点,我们利用这个类型为管道注册需要的中间件。一般来说,被注册的启动类型必须具有一个类似于下面代码片断所示的Configure方法,这个方法可以是静态方法和也可以实例方法。这个方法的参数并没有严格的限制,但是第一个参数类型必须是IApplicationBuilder接口。

   1: public class Startup
   2: {
   3:     public void Configure(IApplicationBuilder app);
   4: }

对中间件的注册就是实现在这样一个Configure方法之中。在演示的实例中,我们调用了IApplicationBuilder接口的扩展方法Run注册了一个中间件,它承载的请求处理逻辑很简单,即使直接响应一个“Hello World”字符串。在真实的项目中,我们会根据具体的应用场景在这样一个方法中利用ApplicationBuilder注册相应的中间件进而构建一个适合当前请求处理需求的管道。

   1: public class Startup
   2: {
   3:     public void Configure(IApplicationBuilder app)
   4:     {
   5:         app.UseExceptionHandler("/Home/Error");
   6:         app.UseStaticFiles();
   7:         app.UseIdentity();           
   8:  
   9:         app.UseMvc();
  10:     }
  11: }

比如在一个ASP.NET Core MVC应用中我们除了按照如上的方式调用扩展方法UseMvc注册了支撑MVC框架的中间件(实际上是一个实现路由的中间件)之外,我们还通过调用其它的扩展方法注册了相应的中间件实现了对静态文件的访问(UseStaticFiles)、错误页面的呈现(UseExceptionHandler)以及基于ASP.NET Identity Framework的认证(UseIdentity)。

 


一、采用管道处理HTTP请求
二、创建一个“迷你版”的管道来模拟真实管道请求处理流程
三、管道如何处理HTTP请求的
四、管道是如何被创建出来的

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

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

相关文章

emui消息推送服务器,别再抱怨,这次或许真的轮到你了,EMUI9.1推送进度再次更新...

最近几年里&#xff0c;华为在系统方面下的功夫可谓是大家有目共睹的。以往大家在使用华为EMUI操作系统的时候&#xff0c;或许会感觉到卡顿、应用启动时间过长、运行不流畅以及UI界面毫无亮点可言等&#xff0c;但那已经是过去的EMUI系统了&#xff0c;今日的EMUI系统已与往日…

ASP.NET Core管道深度剖析(2):创建一个“迷你版”的管道来模拟真实管道请求处理流程

从《ASP.NET Core管道深度剖析&#xff08;1&#xff09;&#xff1a;采用管道处理HTTP请求》我们知道ASP.NET Core请求处理管道由一个服务器和一组有序的中间件组成&#xff0c;所以从总体设计来讲是非常简单的&#xff0c;但是就具体的实现来说&#xff0c;由于其中涉及很多对…

ASP.NET Core管道深度剖析(3):管道是如何处理HTTP请求的?

我们知道ASP.NET Core请求处理管道由一个服务器和一组有序的中间件组成&#xff0c;所以从总体设计来讲是非常简单的&#xff0c;但是就具体的实现来说&#xff0c;由于其中涉及很多对象的交互&#xff0c;我想很少人能够地把它弄清楚。为了让读者朋友们能够更加容易地理解管道…

ASP.NET Core管道深度剖析(4):管道是如何建立起来的?

在《管道是如何处理HTTP请求的&#xff1f;》中&#xff0c;我们对ASP.NET Core的请求处理管道的构成以及它对请求的处理流程进行了详细介绍&#xff0c;接下来我们需要了解的是这样一个管道是如何被构建起来的。这样一个管道由一个服务器和一个HttpApplication构成&#xff0c…

ASP.NET MVC 入门1、简介

什么是MVC模式 MVC&#xff08;Model-View-Controller&#xff0c;模型—视图—控制器模式&#xff09;用于表示一种软件架构模式。它把软件系统分为三个基本部分&#xff1a;模型&#xff08;Model&#xff09;&#xff0c;视图&#xff08;View&#xff09;和控制器&#xf…

ASP.NET MVC 入门2、项目的目录结构与核心的DLL

我们新建一个ASP.NET MVC的Web Application后&#xff0c;默认的情况下&#xff0c;项目的目录结构如下&#xff1a; App_Data &#xff1a;这个目录跟我们一般的ASP.NET website是一样的&#xff0c;用于存放数据。Content &#xff1a;这个目录是建议用来存放一下资源文件的。…

Maven超详细配置

&#x1f468;‍&#x1f393; 博主介绍&#xff1a;大家好&#xff0c;我是超梦梦梦梦&#xff0c;很高兴认识大家~&#x1f357;关注➕点赞➕评论➕收藏 &#x1f604;&#x1f64f;博主水平有限&#xff0c;如有错误&#xff0c;欢迎各位大佬纠正&#xff01; 目录&#x1f…

ASP.NET MVC 入门3、Routing

本系列文章基于Microsoft ASP.NET MVC Beta. 在一个route中&#xff0c;通过在大括号中放一个占位符来定义( { and } )。当解析URL的时候&#xff0c;符号"/"和"."被作为一个定义符来解析&#xff0c;而定义符之间的值则匹配到占位符中。route定义中不在大…

一篇教你xftp连接阿里云轻量级应用服务器。超级详细,避免踩坑

&#x1f468;‍&#x1f393; 博主介绍&#xff1a;大家好&#xff0c;我是超梦梦梦梦&#xff0c;很高兴认识大家~ &#x1f357;关注➕点赞➕评论➕收藏 &#x1f604; &#x1f64f;博主水平有限&#xff0c;如有错误&#xff0c;欢迎各位大佬纠正&#xff01; &#x1f52…

ASP.NET MVC 入门4、Controller与Action

本系列文章基于ASP.NET MVC Preview5. Controller是MVC中比较重要的一部分。几乎所有的业务逻辑都是在这里进行处理的&#xff0c;并且从Model中取出数据。在ASP.NET MVC Preview5中&#xff0c;将原来的Controller类一分为二&#xff0c;分为了Controller类和ControllerBase类…

Postman下载与安装操作步骤【超详细】

&#x1f468;‍&#x1f393; 博主介绍&#xff1a;大家好&#xff0c;我是超梦梦梦梦&#xff0c;很高兴认识大家~&#x1f357;关注➕点赞➕评论➕收藏 &#x1f604;&#x1f64f;博主水平有限&#xff0c;如有错误&#xff0c;欢迎各位大佬纠正 Postman下载与安装&#x1…

C#异步编程模型

什么是异步编程模型 异步编程模型(Asynchronous Programming Model&#xff0c;简称APM)是C#1.1支持的一种实现异步操作的编程模型&#xff0c;虽然已经比较“古老”了&#xff0c;但是依然可以学习一下的。通过对APM的学习&#xff0c;我总结了以下三点&#xff1a; 1. APM的…

不会卸载MySQL?我连夜肝了一篇教你如何干干净净地卸载掉MySQL

&#x1f468;‍&#x1f393; 博主介绍&#xff1a;大家好&#xff0c;我是超梦梦梦梦&#xff0c;很高兴认识大家~ &#x1f64f;如果本博文对小伙伴们有帮助的话&#xff0c;&#x1f50e;关注➕&#x1f91e;点赞➕&#x1f4cb;评论➕&#x1f604;收藏一波哦~ &#x1…

设计模式篇

一. 什么是设计模式 纠结了好久&#xff0c;今天终于下定决心开始写设计模式系列&#xff0c;因为这个系列章节确实不好写&#xff0c;在这之前&#xff0c;也看了好多关于设计模式的博客、视频、书籍等&#xff0c;大多数用的例子要么猫啊狗啊、大雁等动物类&#xff1b;要么就…

Navicat15安装笔记

&#x1f468;‍&#x1f393; 博主介绍&#xff1a;大家好&#xff0c;我是超梦梦梦梦&#xff0c;很高兴认识大家~ &#x1f50e;关注➕&#x1f91e;点赞➕&#x1f4cb;评论➕&#x1f604;收藏 &#x1f4c5;创作日期&#xff1a;2021年12月29日 &#x1f4c5;修改日期…

MySQL5安装配置笔记【超详细】

&#x1f468;‍&#x1f393; 博主介绍&#xff1a;大家好&#xff0c;我是超梦梦梦梦&#xff0c;很高兴认识大家~ &#x1f64f;如果本博文对小伙伴们有帮助的话&#xff0c;&#x1f50e;关注➕&#x1f91e;点赞➕&#x1f4cb;评论➕&#x1f604;收藏一波哦~ &#x1…

IDEA常用快捷键大合集

&#x1f468;‍&#x1f393; 博主介绍&#xff1a;大家好&#xff0c;我是超梦梦梦梦&#xff0c;很高兴认识大家~ &#x1f64f;如果本博文对小伙伴们有帮助的话&#xff0c;&#x1f50e;关注➕&#x1f91e;点赞➕&#x1f4cb;评论➕&#x1f604;收藏一波哦~ &#x1…

KnockoutJs篇:快速掌握KnockoutJs

一、引言 之前这个系列文章已经介绍Bootstrap。由于最近项目中&#xff0c;前端是Asp.net MVC KnockoutJs Bootstrap来做的。所以我又重新开始写这个系列。今天就让我们来看看Web前端的MVVM框架——KnockoutJs。 二、KnockoutJs是什么&#xff1f; 做.NET开发的人应该都知道…

IDEA常用设置【很实用】

&#x1f468;‍&#x1f393; 博主介绍&#xff1a;大家好&#xff0c;我是超梦梦梦梦&#xff0c;很高兴认识大家~ &#x1f64f;如果本博文对小伙伴们有帮助的话&#xff0c;&#x1f50e;关注➕&#x1f91e;点赞➕&#x1f4cb;评论➕&#x1f604;收藏一波哦~ &#x1…

【git下载安装与配置】

&#x1f468;‍&#x1f393; 博主介绍&#xff1a;大家好&#xff0c;我是超梦梦梦梦&#xff0c;很高兴认识大家~ &#x1f64f;如果本博文对小伙伴们有帮助的话&#xff0c;&#x1f50e;关注➕&#x1f91e;点赞➕&#x1f4cb;评论➕&#x1f604;收藏一波哦~ &#x1…