IIS Hosting 與 OWIN Self-Hosting
- IIS Hosting
是指將 ASP.NET Web Api 程序發(fā)布到 IIS Manager 的方式運(yùn)行 - OWIN Self-Hosting
是指ASP.NET Web Api程序以自宿主的方式運(yùn)行极颓,不依賴 IIS ,在 .NET Core 中,默認(rèn)以自宿主的方式運(yùn)行程序,其服務(wù)器為 kestrel
HTTP Request
無論是以哪種方式運(yùn)行,當(dāng)接收到一個(gè) HTTP Request 的時(shí)候渗蟹,HTTP Request 消息在第一時(shí)間會(huì)被轉(zhuǎn)化為一個(gè) HttpRequestMessage 對象,這個(gè) HttpRequestMessage 提供了對 HTTP 消息的強(qiáng)類型訪問對象;
DelegatingHandler
HTTP message handles (HTTP 消息處理器)處于整個(gè)處理管道中的第一步嫡丙,它們在進(jìn)入時(shí)處理 HTTP 請求消息,在退出時(shí)處理 HTTP 響應(yīng)消息读第。
如果想自定義一個(gè) message handle (消息處理器),可以從 DelegatingHandler 這個(gè)類派生得到曙博,并且可以添加多個(gè)自定義的消息處理器。
消息處理器可以是全局的怜瞒,也可以是指定給特定的一個(gè)路由的父泳。每個(gè)路由中的消息處理器僅在該對應(yīng)的路由被相應(yīng)的請求匹配的時(shí)候觸發(fā)。所有的路由消息處理器在路由表中配置吴汪。
值得注意的是惠窄,消息處理器可以直接創(chuàng)建一個(gè)響應(yīng),使得管道中的其余操作都被跳過漾橙。
HttpRoutingDispatcher
如果Route.Handle為空杆融,則進(jìn)入 HttpControllerDispatcher ,否則進(jìn)入 Per-route Message Handles 中進(jìn)行路由處理器處理霜运,再進(jìn)入 HttpMessageHandler
HttpMessageHandler
HttpMessageHandler 消息處理器可以調(diào)用 HttpControllerDispatcher 并返回到主管道中脾歇,或者直接提供一個(gè)自定義的返回標(biāo)志。
HttpControllerDispatcher
HttpControllerDispatcher 消息處理可以創(chuàng)建一個(gè)響應(yīng)淘捡,使得管道中的其余操作都被跳過介劫。
其主要的職責(zé)為創(chuàng)建 API 控制器
分兩個(gè)步驟
- 選擇控制器類型
- 激活控制器(初始化控制器)
激活控制器后進(jìn)入控制器消息管道中
Select Controller Action
依據(jù)請求的 URL ,創(chuàng)建 Api 控制器案淋,并選著對應(yīng)的
Action座韵,經(jīng)由 IHttpActionInvoker 處理后返回 HttpActionDescriptor(Action的描述)
Authentication Filters
授權(quán)過濾器,請求進(jìn)入后,如果對應(yīng)的請求需要進(jìn)行授權(quán)校驗(yàn)誉碴,則依據(jù) Authentication Filters 來進(jìn)行權(quán)限校驗(yàn)宦棺,同樣的,如果授權(quán)失敗黔帕,則授權(quán)過濾器會(huì)直接創(chuàng)建一個(gè)錯(cuò)誤響應(yīng)代咸,使得管道中的其余操作都被跳過。
授權(quán)通過后成黄,進(jìn)入模型綁定呐芥。
Model Binding
模型綁定使用請求為 Action 的參數(shù)創(chuàng)建值。這些值在調(diào)用 Action 時(shí)傳遞給 Action 奋岁。
請求信息中包含了:
- URL
- Headers
- Entity-body
對應(yīng)的綁定方式也有三種
- FormatterParameterBinding:如果請求體不為空思瘟,則會(huì)匹配該類型的模型綁定方式;
- ModelBinderParameterBinding: 默認(rèn)的綁定方式闻伶,即從 URL 的路徑和查詢字符串中進(jìn)行簡單類型綁定滨攻;
- HttpParameterBinding:自定義參數(shù)綁定可以讀取任何 http 請求。
接下來進(jìn)入 Action 過濾器
Action Filter
Action Filter 會(huì)被調(diào)用兩次蓝翰,分別為 Action 執(zhí)行前和 Action 執(zhí)行之后光绕。ActionFilterAttribute類中包含了 Action Filter 的兩個(gè)方法(包含異步方法)
- OnActionExecuting - Action執(zhí)行開始前觸發(fā)
- OnActionExecuted - Action執(zhí)行結(jié)束后觸發(fā)
接下來就是進(jìn)入到 Action 中
Invoke Action
調(diào)用 控制器的 Action ,使用 HttpActionContext 作為綁定和模型狀態(tài)
如果發(fā)生異常畜份,則進(jìn)入 Exception Filter中
Exception Filters
未處理的異常會(huì)被路由到異常過濾器诞帐。
Exception Filter 會(huì)創(chuàng)建一個(gè)錯(cuò)誤的響應(yīng),并結(jié)束此次請求過程爆雹。
Result Conversion
如果請求正確執(zhí)行景埃,就會(huì)進(jìn)入到結(jié)果轉(zhuǎn)換過程中
Action 的返回值會(huì)被轉(zhuǎn)換為HttpResponseMessage。
- HttpResponseMessage
如果返回的是 HttpResponseMessage顶别,則直接通過
- void
如果返回的是 void谷徙,那么會(huì)創(chuàng)建一個(gè)狀態(tài)碼為204的響應(yīng),表示執(zhí)行成功且無返回值驯绎。
- IHttpActionResult
如果返回的是 IHttpActionResult完慧,則會(huì)調(diào)用 ExecuteAync 去創(chuàng)建一個(gè) HttpResponseMessage。
- Other types
如果都不是以上三種類型剩失,則一個(gè) media-type 格式化程序序列化該值并將其寫入消息體屈尼。