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 格式化程序序列化该值并将其写入消息体。