ASP.NET Web Api 2 Http消息生命周期

ASP.NET Web Api 2 Http 消息生命周期

IIS Hosting 与 OWIN Self-Hosting

  • IIS Hosting
    是指将 ASP.NET Web Api 程序发布到 IIS Manager 的方式运行
  • OWIN Self-Hosting
    是指ASP.NET Web Api程序以自宿主的方式运行,不依赖 IIS ,在 .NET Core 中,默认以自宿主的方式运行程序,其服务器为 kestrel

HTTP Request

无论是以哪种方式运行,当接收到一个 HTTP Request 的时候,HTTP Request 消息在第一时间会被转化为一个 HttpRequestMessage 对象,这个 HttpRequestMessage 提供了对 HTTP 消息的强类型访问对象;

DelegatingHandler

HTTP message handles (HTTP 消息处理器)处于整个处理管道中的第一步,它们在进入时处理 HTTP 请求消息,在退出时处理 HTTP 响应消息。

如果想自定义一个 message handle (消息处理器),可以从 DelegatingHandler 这个类派生得到,并且可以添加多个自定义的消息处理器。

消息处理器可以是全局的,也可以是指定给特定的一个路由的。每个路由中的消息处理器仅在该对应的路由被相应的请求匹配的时候触发。所有的路由消息处理器在路由表中配置。

值得注意的是,消息处理器可以直接创建一个响应,使得管道中的其余操作都被跳过。

HttpRoutingDispatcher

如果Route.Handle为空,则进入 HttpControllerDispatcher ,否则进入 Per-route Message Handles 中进行路由处理器处理,再进入 HttpMessageHandler

HttpMessageHandler

HttpMessageHandler 消息处理器可以调用 HttpControllerDispatcher 并返回到主管道中,或者直接提供一个自定义的返回标志。

HttpControllerDispatcher

HttpControllerDispatcher 消息处理可以创建一个响应,使得管道中的其余操作都被跳过。
其主要的职责为创建 API 控制器



分两个步骤

  • 选择控制器类型
  • 激活控制器(初始化控制器)

激活控制器后进入控制器消息管道中

Select Controller Action


依据请求的 URL ,创建 Api 控制器,并选着对应的
Action,经由 IHttpActionInvoker 处理后返回 HttpActionDescriptor(Action的描述)

Authentication Filters

授权过滤器,请求进入后,如果对应的请求需要进行授权校验,则依据 Authentication Filters 来进行权限校验,同样的,如果授权失败,则授权过滤器会直接创建一个错误响应,使得管道中的其余操作都被跳过。
授权通过后,进入模型绑定。


Model Binding

模型绑定使用请求为 Action 的参数创建值。这些值在调用 Action 时传递给 Action 。



请求信息中包含了:

  • URL
  • Headers
  • Entity-body

对应的绑定方式也有三种

  • FormatterParameterBinding:如果请求体不为空,则会匹配该类型的模型绑定方式;
  • ModelBinderParameterBinding: 默认的绑定方式,即从 URL 的路径和查询字符串中进行简单类型绑定;
  • HttpParameterBinding:自定义参数绑定可以读取任何 http 请求。

接下来进入 Action 过滤器

Action Filter

Action Filter 会被调用两次,分别为 Action 执行前和 Action 执行之后。ActionFilterAttribute类中包含了 Action Filter 的两个方法(包含异步方法)

  • OnActionExecuting - Action执行开始前触发
  • OnActionExecuted - Action执行结束后触发

接下来就是进入到 Action 中

Invoke Action


调用 控制器的 Action ,使用 HttpActionContext 作为绑定和模型状态

如果发生异常,则进入 Exception Filter中

Exception Filters

未处理的异常会被路由到异常过滤器。
Exception Filter 会创建一个错误的响应,并结束此次请求过程。

Result Conversion

如果请求正确执行,就会进入到结果转换过程中



Action 的返回值会被转换为HttpResponseMessage。

  • HttpResponseMessage

如果返回的是 HttpResponseMessage,则直接通过

  • void

如果返回的是 void,那么会创建一个状态码为204的响应,表示执行成功且无返回值。

  • IHttpActionResult

如果返回的是 IHttpActionResult,则会调用 ExecuteAync 去创建一个 HttpResponseMessage。

  • Other types

如果都不是以上三种类型,则一个 media-type 格式化程序序列化该值并将其写入消息体。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,027评论 19 139
  • Spring Web MVC Spring Web MVC 是包含在 Spring 框架中的 Web 框架,建立于...
    Hsinwong阅读 22,601评论 1 92
  • 本系列主要翻译自《ASP.NET MVC Interview Questions and Answers 》- B...
    圣杰阅读 4,012评论 0 56
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 173,774评论 25 709
  • 昨日闲逛朋友圈,发现一个好玩儿的App(平行世界)。在里面谁也不认识谁,反而多了几分神秘感。再也不用胆怯,也不必担...
    风海晨阅读 222评论 0 0