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

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

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 格式化程序序列化該值并將其寫入消息體屈尼。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市拴孤,隨后出現(xiàn)的幾起案子脾歧,更是在濱河造成了極大的恐慌,老刑警劉巖演熟,帶你破解...
    沈念sama閱讀 217,406評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件鞭执,死亡現(xiàn)場離奇詭異司顿,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)兄纺,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,732評論 3 393
  • 文/潘曉璐 我一進(jìn)店門大溜,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人估脆,你說我怎么就攤上這事钦奋。” “怎么了疙赠?”我有些...
    開封第一講書人閱讀 163,711評論 0 353
  • 文/不壞的土叔 我叫張陵付材,是天一觀的道長。 經(jīng)常有香客問我圃阳,道長厌衔,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,380評論 1 293
  • 正文 為了忘掉前任限佩,我火速辦了婚禮,結(jié)果婚禮上裸弦,老公的妹妹穿的比我還像新娘祟同。我一直安慰自己,他們只是感情好理疙,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,432評論 6 392
  • 文/花漫 我一把揭開白布晕城。 她就那樣靜靜地躺著,像睡著了一般窖贤。 火紅的嫁衣襯著肌膚如雪砖顷。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,301評論 1 301
  • 那天赃梧,我揣著相機(jī)與錄音滤蝠,去河邊找鬼。 笑死授嘀,一個(gè)胖子當(dāng)著我的面吹牛物咳,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播蹄皱,決...
    沈念sama閱讀 40,145評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼览闰,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了巷折?” 一聲冷哼從身側(cè)響起压鉴,我...
    開封第一講書人閱讀 39,008評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎锻拘,沒想到半個(gè)月后油吭,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,443評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,649評論 3 334
  • 正文 我和宋清朗相戀三年上鞠,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了际邻。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,795評論 1 347
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡芍阎,死狀恐怖世曾,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情谴咸,我是刑警寧澤轮听,帶...
    沈念sama閱讀 35,501評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站岭佳,受9級特大地震影響血巍,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜珊随,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,119評論 3 328
  • 文/蒙蒙 一述寡、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧叶洞,春花似錦鲫凶、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,731評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至艺晴,卻和暖如春昼钻,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背封寞。 一陣腳步聲響...
    開封第一講書人閱讀 32,865評論 1 269
  • 我被黑心中介騙來泰國打工然评, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人狈究。 一個(gè)月前我還...
    沈念sama閱讀 47,899評論 2 370
  • 正文 我出身青樓沾瓦,卻偏偏與公主長得像,于是被迫代替她去往敵國和親谦炒。 傳聞我的和親對象是個(gè)殘疾皇子贯莺,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,724評論 2 354

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn)宁改,斷路器缕探,智...
    卡卡羅2017閱讀 134,654評論 18 139
  • Spring Web MVC Spring Web MVC 是包含在 Spring 框架中的 Web 框架,建立于...
    Hsinwong閱讀 22,396評論 1 92
  • 本系列主要翻譯自《ASP.NET MVC Interview Questions and Answers 》- B...
    圣杰閱讀 3,952評論 0 56
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,108評論 25 707
  • 昨日閑逛朋友圈还蹲,發(fā)現(xiàn)一個(gè)好玩兒的App(平行世界)爹耗。在里面誰也不認(rèn)識(shí)誰耙考,反而多了幾分神秘感。再也不用膽怯潭兽,也不必?fù)?dān)...
    風(fēng)海晨閱讀 210評論 0 0