美文网首页.Net CoreASP.NET Core
HTTP请求的处理流水线 -- 理解ASP.NET Core中的

HTTP请求的处理流水线 -- 理解ASP.NET Core中的

作者: 程序采摘园 | 来源:发表于2018-06-09 22:32 被阅读233次

理解管道对一个后端开发人员很是重要,可以说这是一种不同于桌面程序开发的编程思维。比方说要检查用户的输入(以参数的形式传入),基于桌面开发的经验,我第一反应会是在每个函数开始处都先调用UserInput.Validate(XXX),如果通不过检查就返回错误信息。听起来挺“正确”的做法,但是在后端开发中这属于不正确的方式。那么ASP.NET Core中怎么做才正确呢?下面就讲讲ASP.NET Core的管道(Pipeline),以及如何用 “管道思维” 来解决这个问题。(本篇属于概念介绍型,不涉及具体实现及代码细节

Web程序的简单理解就是,浏览器发送一个请求(http request),服务器处理并响应这个请求,并返回给浏览器结果 (http response)。如图1所示 图1 Web程序 那么服务器内部如何处理请求并返回结果?也就是后端程序如何工作的呢?ASP.NET Core采用管道(pipeline)的方式。如图2所示 图2 ASP.NET Core管道
  1. HTTP请求先到达一个叫Kestrel的Web Server。 Kestrel负责接收HTTP请求并把请求内容(字符串流)转化成结构化的数据(HttpContext)供后面的中间件使用。
  2. 中间件(Middleware)是一个对HTTP请求和响应进行处理的组件。什么意思呢?就是中间件会对从上游来的HTTP请求做一定的操作/处理/检查,然后将HTTP请求传给下一个中间件;对从下游回来的HTTP响应做一定的操作/处理,再返回给上一个中间件。当然,中间件也可以忽略对HTTP请求或者HTTP响应的处理而直接传给下一个或返回上一个中间件。比如
    a. 用户认证(Authentication)中间件只检查HTTP请求的用户信息,是合法用户就向后传递HTTP请求;
    b. 日志中间件可以只检查HTTP响应,记录响应内容到日志,然后向前返回该响应;
    中间件还可以处理完请求后直接返回HTTP响应,无需向下传递。比如用户认证中间件找不到合法用户信息,这时会直接返回响应而无须通知后续中间件。
  3. 多个中间件连接在一起就构成了中间件管道(Middleware Pipeline),每个中间件负责一个特定职责。每个中间件都需要显式添加到管道中,并且添加的顺序很重要。比方说,如果用户认证中间件被第一个添加到管道,那没有用户信息的HTTP请求都会直接被返回;但是如果它被放到StaticFiles中间件之后,那没有用户信息的HTTP请求访问一个存在的静态文件时,会被StaticFiles中间件处理并返回正确的文件。
    a. ASP.NET Core自带的中间件有用户认证,CORS,Response Compression,Static Files,URL Rewriting等;
    b. 第三方提供的中间件,如生成API文档的Swagger等;
    c. 自己定制的中间件,如检查特定用户信息的定制用户认证中间件等
  4. ASP.NET Core中有一个特殊的“中间件”,ASP.NET Core MVC。 MVC是一个采用Model-View-Controller模式的开发框架。它被加到中间件管道的末尾,用来处理HTTP请求的业务逻辑。MVC自身的设计也是管道模式,叫做过滤器管道(Filter Pipeline),一个过滤器就相当于一个中间件。MVC主要用来:
    a. 从HTTP请求中提取用户的输入信息(字符串)到结构化的模型中(Model Binding),并且做验证(Model Validation);
    b. 把HTTP请求发送到恰当的控制器处理方法(Controller,Action method)上去,这个过程叫路由(Routing);
    c. 控制器解析请求,做出处理,并生成HTTP响应(如生成HTML页面,生成响应数据等)。

总结

  • ASP.NET Core后端程序是管道模式,中间件可自由配置,但顺序很重要;
  • ASP.NET Core中编程时,要实现一个和特定业务不相关的功能(并且很多Action method都需要)时,首先考虑加过滤器或中间件
  • 有很多很流行的第三方中间件,找到并配置好恰当的中间件,Asp.net core编程就成功了一大半。

相关文章

网友评论

    本文标题:HTTP请求的处理流水线 -- 理解ASP.NET Core中的

    本文链接:https://www.haomeiwen.com/subject/biuxeftx.html