asp.net mvc 管道模型 学习总结

1.Http请求处理流程

处理文件

1 IIS根据文件的后缀名处理html或asp

2  服获取后缀名以后,寻找处理的程序,找不到或没有受到服务器端的保护 直接返还文件。(受保护的例子是 App_Code中的),

3 处理后缀名程序,称为 ISAPI 应用程序,代理作用,映射请求页面和后缀名相对的处理程序。

一个完整的HTTP请求流程:

  1. 1.用户浏览器输入地址,
  2. 2.DNS解析(域名供应商):将输入的网址解析成IP+端口
  3. 3.请求到达服务器Server:IP在互联网定位服务器,端口确定进程,端口还可以带有协议信息,用于穿过防火墙。
  4. 4.HTTP.SYS服务接收HTTP请求,交给iis
  5. 5.IIS将请求发到对应的程序处理
  6. 6 请求包装成HttpWorkerRequest对象
  7. 7 传到AppDomain的HttpRuntime入口
  8. 8  开始管道模型()
  9. 9  IIS接收返回的数据流,给HTTP.SSY
  10. 10  HTTP.SYS将数据给客户端(浏览器)

2.理解宿主环境(Hosting)

卸载运行在同一进程的应用程序,请求分放在相互隔离的应用程序域中( AppDomain)。

HTTP.SYS 监听外部的 HTTP请求

在操作系统启动,IIS在HTTP.SYS中注册虚拟路径。

HttpRuntime类是Asp.Net的主要入口, 有ProcessRequest方法,HttpWorkerRequest 类为参数。

HttpRuntime 类包含单个 Http请求信息

管道(Pipeline)模型概念

责任链模式的变种(实现方式)

责任链模式多个对象组成链子传递该请求,直到有对象处理它为止。

优点  1降低了发送者和接收者耦合。2 把多个条件分散到各个处理类中。

缺点,如: 1 未在找到正确,所有的条件判定都要执行 2可能某个请求不被处理。

管道模型:多个对象组成链子传递该请求。

优点:流程式(有序)+可拆卸(配置)

缺点:每次请求都必须从链头开始遍历

管道模型:

管道由托管模块(Managed Modules)和处理程序(Handlers)组成且由管道处理 Http请求。这就是asp管道模型

HttpContext(请求上下文):HttpRequest、HttpResponse、HttpSessionState

(WebForm)

  1. 首先HTTPRuntime,通过HttpApplicationFactory创建HttpApplication。
  2. HttpApplication会创建该次Http请求的HttpContext(上下文)
  3. 通过Module,实际工作前
  4. 被HttpHandler处理。实际工作,页面继承“Page”,“Page”继承“IHttpHandler”
  5. 回到Module,实际工作后

管道理解:

ii7前:IIS请求处理管道和ASP.NET管道

ii7后,管道流程执行,例如BeginRequest、AuthenticateRequest、…、EndRequest。 19个事件

优点:自定义HttpModule或者HttpHandler,集成到IIS上

MVC

  1. 首先HTTPRuntime,通过HttpApplicationFactory创建HttpApplication。
  2. HttpApplication会创建该次Http请求的HttpContext(上下文)
  3. 进入UrlRoutingModule(路由系统),获取Controller和Action及路由数据。
  4. 匹配Route规则,获取Route对象,解析对象。
  5. 请求IRouteHandler(MVCRouteHandler)
  6. 执行ProcessRequest方法,使用ControllerBulider获取ControllerFactory
  7. 调用到Controller,到达Action,并执行
  8. 在执行Controller与Action可能有各种认证,各种特性拦截
  9. 业务代码
  10. 返回ActionResult
  11. 响应Http
  12. 客户端接收响应

MVC具体细节

HttpApplication与HttpModule

HTTP请求由ASP.NET运行时接管之后,HttpRuntime会利用HttpApplicationFactory创建或从HttpApplication对象池(.NET中类似的机制有线程池和字符串拘留池)中取出一个HttpApplication对象,同时ASP.NET会根据配置文件来初始化注册的HttpModule,HttpModule在初始化时会订阅HttpApplication中的事件来实现对HTTP请求的处理。

简短个人总结:HttpApplication被创建或对象池取出。配置文件注册HttpModule,订阅事件实现请求处理。

HttpApplication继承了IHttpHandler,是跟WebForm的Page是一样的

Route

路由系统从请求URL中获取controller和action的名称以及其它请求数据。
UrlRoutingModule根据URL和RouteTable路由模板匹配返回第一个匹配的路由对象Route,获取路由数据对象RouteData,再获取IRouteHandler最终得到IHttpHandler(实现)

HttpHandler

请求最终进入HttpHanler中处理,一次被一个HttpHandler处理。至少经过一个HttpModule的处理。

Controller
IHttpHandler在ProcessRequest方法中对当前请求处理,通过ControllerBuilder得到IControllerFactory然后通过反射的方式获取Controller的类型。

Action

ControllerBase是Controller的基类,该类型的Execute方法中通过IActionInvoker的InvokeAction方法来执行对Action的调用。在Action执行前会进行模型绑定和模型认证操作。

Filters

MVC5中常用过滤器有5个:IAuthenticationFilter、IAuthorizationFilter、IActionFilter、IResultFilter、IExceptionFilter。
过滤器最终被封装为Filter对象,该对象中FilterScope类的Scope和int的Order决定过滤器执行顺序,具体规则如下:
Order和Scope的数值越小,过滤器的执行优先级越高;
Order比Scope具有更高的优先级,在Order属性值相同时FilterScope才会被考虑

ActionResult

Action执行完毕返回ActionResult为处理结果,不是ActionResult,转换为ActionResult。

.NET Core

有独立的SDK,RunTime

有自己的Kestrel Server,对外部提供服务。需要反向代理服务器,IIS是其一,其他平台有其他的方式.

知识点:IIS 通过 HTTP 调用.NET Core 程序。部署在IIS中,不用手动启动 ANET Core 程序,IIS新增 AspNetCoreModule 模块,负责 ASP.NET Core 程序的启动与停止,并监听 状态,崩溃时重新启动。

Kestrel 中间件。

appsettinggs.json 是配置文件。

Hostting(宿主)

必须创建Host启动Core,通过宿主生成Http的上下文,环境等。整个请求在宿主内。

WeHost通过静态本创建出。“CreateDefaultBuilder”做简单的配置

  1. 注册 中间件,指定使用的 Server(HTTP服务器)。
  2. 将当前项目的根目录作为 ContentRoot 的目录。
  3. 读取配置文件,开发环境下的 UserSecrets 以及环境变量和命令行参数
  4. 读取配置文件中的 Logging 节点,对日志系统进行配置
  5. 添加 IISIntegration 中间件
  6. 设置开发环境下, ServiceProvider 的 ValidateScopes 为 true,避免直接在 Configure 方法中获取 Scope 实例。

简单总结:“CreateDefaultBuilder”做的配置

1 指定服务器2设置根目录 3 读取配置文件配置 4 日志系统配置 5 添加中间件。 6 避免直接获取scope

接着指定Startup最终使用Build创建WebHost。紧接着使用Run将程序跑起来。

Http Server 是HTTP服务器,监听HTTP,接收 FeatureCollection 的原始请求,包装成 HttpContext 

IApplicationBuilder 建应请求管道,也就是生成 RequestDelegate

WebHost的启动

  1. 初始化,构建 RequestDelegate
  • RequestDelegate 是我们的应用程序处理请求,输出响应的整个过程,也就是我们的 ASP.NET Core 请求管道。
    • 调用 Startup 中的 ConfigureServices 方法
    • 初始化 Http Server
    • 创建 IApplicationBuilder
    • 配置 IApplicationBuilder
  1. 启动 Server,监听请求并响应
  2. 启动 HostedService

1 创建并配置 IApplicationBuilder 2 启动server 启动hostedservice

 Middleware(中间件),管道模型的构成

请求管道,是对 HttpContext 的操作,即对 Request 的处理,生成 Reponse。因此,定义了 RequestDelegate 委托,来表示请求管道的步骤,它有如下定义:
public delegate Task RequestDelegate(HttpContext context);
注册是过 Func<RequestDelegate, RequestDelegate> 类型的委托实现的。它接收RequestDelegate 的参数,并返回 RequestDelegate ,前一个中间件的输出成为下一个中间件的输入,串联起来形成了完整的管道。
它有一个内部的 Func<RequestDelegate, RequestDelegate> 类型的集合(用来保存我们注册的中间件)和三个核心方法:
1. Use
Use是注册中间件,将中间件保存到其内部属性 _components 中。
2. Build
创建RequestDelegate 类型的委托,Http Server 通过该委托完成请求的响应
3. Run

注册最后一个中间件
4. New
“克隆”新的 ApplicationBuilder 对象,对自身属性的修改,不影响创建者,通过 CopyOnWriteDictionary 实现

 Core的管道就是Middleware来做的,每个都有前置,后置的处理步骤,中间可以调用其他Middleware。也可以并行走向。

总结

WebForm,MVC的ISAPI以插件形式存在IIS,Core跨平台,IIS只是反向代理,HTTP请求带Core的程序,运行Core。
HTTP请求,在彼此的AppDomain中创建HttpContext,。

WebFrom走PageIHTTPHandler与Module,走 Pipeline

MVC是Global.asax继承HttpApplication,HttpApplication又继承IHTTPHandler, 走 Pipeline

Core,采用Middleware(中间件)的形式。走Pipeline

WebHost的创建

public class Program{
public static void Main(string[] args){
CreateWebHostBuilder(args).Build().Run();
}

  public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
      WebHost.CreateDefaultBuilder(args)
          .UseStartup<Startup>();
  }

管道模型基础:

自定义HttpModule 1 实现IHttpModule,2 webconfig注册,里面给HttpApplication添加动作,

HttpModule是每次请求都执行.

HttpApplication有17个事件处理不同的请求,BeginRequest和EndRequest是做扩展的

PostMapRequestHandler创建处理器对象,写的MVC,Webform,用它实际执行。

HttpContext.ApplicationInstance.GetType().GetEvents() 可以获取所有事件

在PreRequstHandlerExecute(准备执行处理程序),PostRequestHandlerExecute(已经执行了处理程序),ReleaseRequestState(释放请求的状态),PostReleaseRequestState(已经释放了请求的状态)。

HttpContext.ApplicationInstance.GetType().Modules.AllKeys 获取全部Module

三.HttpModule 能干什么

1.权限认证:每个请求都经过Module,所以做权限认证很好。

2.URL转发

新建BaseModule在webcofing注册

重写BeginRequest,获取请求地址,使用context.Request.Url.AbsoluteUri

重定向,使用context.Response.Write

MVC就是Module的扩展,,增加UrlRoutingModule,把请求做映射处理,指向MvcHandler。(和上面实现类似)

伪静态也可以这样做,在IIS给后缀指定处理程序asp.net_isapi,请求进到HttpApplication,扩展Module,建立跳转规则。

3.反爬虫:

请求都要经过Module,记录每个IP,太频繁,访问验证码页面。


 

参考文献:

学习篇:asp.net mvc 管道模型:https://blog.csdn.net/u010690818/article/details/78328070

MVC5管道处理模型:https://blog.csdn.net/m0_37591671/article/details/82970442

Asp.net管道模型(管线模型)http://www.cnblogs.com/kuyusea/p/4638395.html

管道处理模型一!:https://blog.csdn.net/cainong2005/article/details/80114085

管道模型!:http://www.cnblogs.com/xuhuale/p/10030878.html

管道模型 2: https://blog.csdn.net/qq_26545305/article/details/70214912

管道模型3 :http://www.cnblogs.com/fsjohnhuang/articles/2327443.html

猜你喜欢

转载自blog.csdn.net/qq_25744257/article/details/87972344