亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學(xué)院 > 開發(fā)設(shè)計 > 正文

Self Host模式下的ASP. NET Web API是如何進行請求的監(jiān)聽與處理的?

2019-11-17 01:26:33
字體:
供稿:網(wǎng)友

Self Host模式下的asp. NET Web API是如何進行請求的監(jiān)聽與處理的?

構(gòu)成asp.net Web API核心框架的消息處理管道既不關(guān)心請求消息來源于何處,也不需要考慮響應(yīng)消息歸于何方。當我們采用Web Host模式將一個ASP.NET應(yīng)用作為目標Web API的宿主時,實際上是由ASP.NET管道解決了這兩個問題。具體來說,ASP.NET自身的URL路由系統(tǒng)借助于HttpControllerHandler這個自定義的HttpHandler實現(xiàn)了ASP.NET管道和ASP.NET Web API管道之間的“連通”,但是在Self Host寄宿模式下,請求的監(jiān)聽、接收和響應(yīng)又是如何實現(xiàn)的呢?[本文已經(jīng)同步到《How ASP.NET Web API Works?》]

目錄 一、HttpBinding模型     Binding模型     HttpBinding     實例演示:直接利用HttpBinding進行請求的接收和響應(yīng) 二、HttpSelfHostServer     HttpSelfHostConfiguration     HttpSelfHostServer與消息處理管道     實例演示:創(chuàng)建自定義HttpServer模擬HttpSelfHostServer的工作原理

一、HttpBinding模型

和WCF服務(wù)一樣,我們可以采用Self Host模式將Web API寄宿于任何一種類型的托管應(yīng)用程序下,宿主可以是一個Windows Form應(yīng)用、WPF應(yīng)用、控制臺應(yīng)用以及Windows Service。Self Host模式下的WCF和ASP.NET Web API不僅外在表現(xiàn)形式極為相似,其實在內(nèi)部實現(xiàn)原理上也是一致的。

Binding模型

對于WCF具有基本了解的讀者應(yīng)該都知道,它是一個基于消息的分布式通信框架,消息交換借助于客戶端和服務(wù)端對等的終結(jié)點(Endpoint)來完成,而終結(jié)點由經(jīng)典的ABC(Address、Binding、Contract)三元素組成。WCF同樣具有一個處理消息的管道,這個管道是一組Channel的有序組合,WCF下的Channel相對于ASP.NET Web API下的HttpMessageHandler。

WCF的消息處理管道的締造者是作為終結(jié)點三要素之一的Binding。Binding不僅僅為服務(wù)端創(chuàng)建用于接收請求回復(fù)響應(yīng)的管道,同時也為客戶端創(chuàng)建發(fā)送請求接收響應(yīng)的管道。Binding模型本身也相對比較復(fù)雜,所以我們不可能對其進行詳細討論。如果讀者對此比較感興趣,可以參閱《WCF的綁定模型》。由于ASP.NET Web API只是利用HttpBinding創(chuàng)建服務(wù)端消息處理管道,所以我們只討論Binding的服務(wù)端模型。

從結(jié)構(gòu)上講,一個Binding是若干BindingElement對象的有序組合。對于最終創(chuàng)建的消息處理管道來說,每個Channel都對應(yīng)著一個BindingElement。BindingElement并非直接創(chuàng)建對應(yīng)的Channel,由它直接創(chuàng)建的實際上是一個名為ChannelListener的對象,Channel由ChannelListener創(chuàng)建。右圖基本揭示了Binding的服務(wù)端模型。

顧名思義,ChannelListener用于請求的監(jiān)聽。當Binding對象開啟(調(diào)用其Open方法)時,每個BindingElement會創(chuàng)建各自的ChannelListener。這些ChannelListener按照對應(yīng)BindingElement的順序連接成串,位于底部(面向傳輸層)的ChannelListener被綁定到某個端口進行請求的監(jiān)聽。一旦探測到抵達的請求,它會利用由所有ChannelListener創(chuàng)建的Channel組成的管道來接收并處理該請求。對于最終需要返回的響應(yīng)消息,則按照從上到下的順序被這個管道進行處理并最終返回給客戶端。

對于這個由Channel組成消息處理管道來說,有兩種類型的Channel是必不可少的。一種是面向傳輸層用于發(fā)送和接收消息的TransportChannel,另一種被稱為MessageEncodingChannel則負責(zé)對接收的消息實施解碼并對發(fā)送的消息實施編碼。TransportChannel由TransportChannelListener創(chuàng)建,而后者由TransportBindingElement創(chuàng)建。與之類似,MessageEncodingBindingElement是MessageEncodingChannelListener的創(chuàng)建者,而后者又是MessageEncodingChannel的創(chuàng)建者。

如果采用Self Host寄宿模式,請求的監(jiān)聽是由一個類型為HttpBinding的Binding對象創(chuàng)建的ChannelListener管道來完成的,由它創(chuàng)建的管道實現(xiàn)了針對請求的接收和針對響應(yīng)的回復(fù)。HttpBinding類型定義在“System.Web.Http.SelfHost.Channels”命名空間下,我們接下來對它進行詳細講述。

HttpBinding

Binding存在的目的在于創(chuàng)建用于處理和傳輸消息的信道棧,組成信道棧的每一個Channel均對應(yīng)著一個BindingElement,所以Binding本身處理消息的能力由其BindingElement的組成來決定,我們可以通過分析BindingElement的組成來了解消息最終是如何處理的?,F(xiàn)在我們就來討論一下ASP.NET Web API在Self Host模式下使用的HttpBinding由哪些BindingElement構(gòu)成。

如左圖所示,HttpBinding僅僅由兩種必需的BindingElement構(gòu)成,TransportBindingElement的類型決定于最終采用的傳輸協(xié)議。如果采用單純的HTTP協(xié)議,采用的TransportBindingElement是一個HttpTransportBindingElement對象。在采用HTTPS協(xié)議的情況下,TransportBindingElement的類型是HttpsTransportBindingElement。

我們現(xiàn)在著重來分析與消息編碼/解碼相關(guān)的BindingElement,從圖3-11可以看出這是一個HttpMessageEncodingBindingElement對象(HttpMessageEncodingBindingElement是一個定義在程序集“System.Web.Http.SelfHost.dll”中的內(nèi)部類型),它最終會創(chuàng)建一個MessageEncoder對象完成針對消息的編碼/解碼工作。

ASP.NET Web API分別利用 HttPRequestMessage和HttpResponseMessage對象表示消息處理管道處理的請求和響應(yīng),而WCF消息處理管道的請求和響應(yīng)均是一個Message對象(Message是定義在命名空間“System.ServiceModel.Channels”下的一個抽象類型)。經(jīng)過HttpMessageEncoder解碼后的Message對象會轉(zhuǎn)成一個HttpRequestMessage對象并傳入ASP.NET Web API消息處理管道進行處理,由此管道返回的HttpResponseMessage對象需要轉(zhuǎn)換成一個Message對象并由HttpMessageEncoder根據(jù)需求進行解碼。

這個具體的消息實際上是一個HttpMessage對象,HttpMessage繼承自抽象類Message,它是一個定義在程序集“System.Web.Http.SelfHost.dll”中的內(nèi)部類型。如下面的代碼片斷所示,HttpMessage實際上是對一個HttpRequestMessage或者HttpResponseMessage對象的封裝,兩個方法GetHttpRequestMessage和GetHttpResponseMessage分別用于提取被封裝的HttpRequestMessage和HttpResponseMessage對象。

   1: internal sealed class HttpMessage : Message
   2: {
   3:     //其他成員   
   4:     public HttpMessage(HttpRequestMessage request);
   5:     public HttpMessage(HttpResponseMessage response);
   6:    
   7:     public HttpRequestMessage  GetHttpRequestMessage(bool extract);
   8:     public HttpResponseMessage GetHttpResponseMessage(bool extract);
   9: }

這兩個方法均具有一個布爾類型的參數(shù)extract,它表示是否“抽取”被封裝的HttpRequestMessage/HttpResponseMessage對象。如果指定的參數(shù)值為True,方法執(zhí)行之后被封裝的HttpRequestMessage/HttpResponseMessage對象會從HttpMessage對象中抽取出來,所以再次調(diào)用它們會返回Null。

再次將我們的關(guān)注點拉回到由HttpBinding創(chuàng)建的消息處理管道上。當我們開啟HttpBinding后,它利用創(chuàng)建的ChannelListener管道監(jiān)聽請求。一旦探測到抵達的請求后,基于HTTP/HTTPS協(xié)議的TransportChannel會負責(zé)接收請求。接收的二進制數(shù)據(jù)會由MessageEncoder解碼后生成一個HttpRequestMessage對象,該對象進而被封裝成一個HttpMessage對象,傳入消息處理管道的HttpRequestMessage是直接通過調(diào)用GetHttpRequestMessage方法從該HttpMessage對象中提取的。

當ASP.NET Web API消息處理管道完成了請求的處理并最終輸出一個HttpResponseMessage對象后,該對象同樣先被封裝成一個HttpMessage對象。在通過傳輸層將響應(yīng)返回給客戶端之前,需要利用MessageEncoder對其進行編碼,而解碼的內(nèi)容實際上就是調(diào)用GetHttpResponseMessage方法提取的HttpResponseMessage對象。

實例演示:直接利用HttpBinding進行請求的接收和響應(yīng)

當我們采用Self Host寄宿模式將一個非Web應(yīng)用程序作為目標Web API的宿主時,最終網(wǎng)絡(luò)監(jiān)聽任務(wù)實際上是由HttpBinding創(chuàng)建的ChannelListener管道來完成的,而ChannelListener管道創(chuàng)建的消息處理管道最終實現(xiàn)了對請求的接收和對響應(yīng)的發(fā)送。為了讓讀者對此具有深刻的認識,我們通過一個簡單的實例來演示如何直接使用HttpBinding實現(xiàn)對請求的監(jiān)聽、接收和響應(yīng)。

我們創(chuàng)建一個空的控制臺程序作為監(jiān)聽服務(wù)器,它相當于Self Host寄宿模式下的宿主程序。如下面的代碼片斷所示,我們創(chuàng)建了一個HttpBinding,并指定監(jiān)聽地址("http://127.0.0.1:3721")調(diào)用其BuildChannelListener<IReplyChannel>方法創(chuàng)建了一個ChannelListener管道(返回的是組成管道的第一個ChannelListener對象)。在調(diào)用Open方法開啟該ChannelListener管道之后,我們調(diào)用其AcceptChannel方法創(chuàng)建了消息處理管道,返回的是組成管道的第一個Channel對象。在Open方法將其開啟后,我們在一個While循環(huán)中調(diào)用Channel對象的ReceiveRequest方法進行請求的監(jiān)聽和接收。

   1: class Program
   2: {
   3:     static void Main(string[] args)
   4:     {
   5:         Uri listenUri = new Uri("http://127.0.0.1:3721");
   6:         Binding binding = new HttpBinding();
   7:  
   8:         //創(chuàng)建、開啟信道監(jiān)聽器
   9:         IChannelListener<IReplyChannel> channelListener = binding.BuildChannelListener<IReplyChannel>(listenUri);
  10:         channelListener.Open();
  11:  
  12:         //創(chuàng)建、開啟回復(fù)信道
  13:         IReplyChannel channel = channelListener.AcceptChannel(TimeSpan.MaxValue);
  14:         channel.Open();
  15:  
  16:         //開始監(jiān)聽
  17:         while (true)
  18:         {
  19:             //接收輸出請求消息
  20:             RequestContext requestContext = channel.ReceiveRequest(TimeSpan.MaxValue);
  21:             PrintRequestMessage(requestContext.RequestMessage);
  22:             //消息回復(fù)
  23:             requestContext.Reply(CreateResponseMessage());
  24:         }
  25:     }
  26: }

對于成功接收的消息,我們調(diào)用具有如下定義的PrintRequestMessage方法將相關(guān)的信息打印在控制臺上。通過上面的介紹我們知道這個接收到的消息實際上是一個HttpMessage對象,由于這是一個內(nèi)部類型,所以我們只能以反射的方式調(diào)用其GetHttpRequestMessage方法獲取被封裝的HttpRequestMessage對象。在得到表示請求的HttpRequestMessage對象之后,我們將請求地址和所有報頭輸出到控制臺上。

   1: private static void PrintRequestMessage(Message message)
   2: {
   3:     MethodInfo method = message.GetType().GetMethod("GetHttpRequestMessage");
   4:     HttpRequestMessage request = (HttpRequestMessage)method.Invoke(message, new object[]{false});
   5:  
   6:     Console.WriteLine("{0, -15}:{1}", "RequestUri", request.RequestUri);
   7:     foreach (var header in request.Headers)
   8:     {
   9:         Console.WriteLine("{0, -15}:{1}", header.Key, string.Join("," ,header.Value.ToArray()));
  10:     }
  11: }

在對請求進行處理之后,我們需要創(chuàng)建一個Message對象對該請求予以響應(yīng),響應(yīng)消息的創(chuàng)建是通過CreateResponseMessage方法完成的。如下面的代碼片斷所示,我們首先創(chuàng)建了一個響應(yīng)狀態(tài)為“200, OK”的HttpResponseMessage對象,并將其表示主體內(nèi)容的Content屬性設(shè)置為一個ObjectContent<Em

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
日韩欧美视频在线播放| 午夜伦理一区二区| 欧美激情视频免费观看| 亚洲精品一区二区三区在线播放| 亚洲图片小说在线| 99久久久精品视频| 天堂一区二区三区四区| 黄色片视频在线播放| 污污污www精品国产网站| 欧美色视频在线| 91麻豆国产精品久久| 成人福利资源| 91精品啪在线观看麻豆免费| 蜜桃视频在线观看www社区| japanesexxxx在线播放| 九九热精品视频| 91嫩草在线| 91嫩草国产线观看亚洲一区二区| 麻豆短视频在线观看| 蜜桃视频网站在线观看| 午夜激情福利在线| 捆绑紧缚一区二区三区视频| 国产精品无码一区二区桃花视频| 欧美色xxxx| 最新高清无码专区| 国产日产欧产精品推荐色| 手机看片福利日韩| 日本一区二区三区免费视频| 国产精品久久久久久久久| 国产视色精品亚洲一区二区| 66视频精品| 午夜电影一区二区三区| canopen超线视频网线的应用| 国产亚洲精品久久久久久无几年桃| 久久99国产精品久久99大师| 毛片毛片毛片毛片毛片毛片毛片毛片毛片| 免费看av毛片| av在线不卡观看免费观看| 久久久精品免费| yellow字幕网在线| 国产日韩欧美精品综合| 免费国产在线观看| 九九视频精品全部免费播放| 一区二区三区影院| 亚洲一级片在线播放| 性一交一乱一乱一视频| 国产精品久久久久国产a级| 97在线视频免费播放| 亚洲精品.www| 成人免费视频国产免费麻豆| 再深点灬舒服灬太大了添少妇视频| 欧美亚洲色图校园春色| 欧美一区二区三区爱爱| 国产精品麻豆一区二区| 国产黄在线播放| 在线观看不卡av| 欧美牲交a欧美牲交aⅴ免费下载| 精品影片一区二区入口| 白浆视频在线观看| 91小视频免费观看| 青青国产91久久久久久| 中文字幕一区二区三区精品| 一区二区三区国产豹纹内裤在线| 国产无遮挡裸体视频在线观看| 日本a级不卡| 国产精品入口福利| 国产一区视频导航| 日日摸天天爽天天爽视频| 亚洲精品色婷婷福利天堂| 婷婷综合五月| 日本三级一区二区三区| 青草av在线| 国产成人精品一区二区色戒| 亚洲啪av永久无码精品放毛片| 久久久免费观看| 日本一区精品久久久久影院| 最近中文字幕mv免费高清在线| 男女视频一区二区三区| 91无套直看片红桃在线观看| www.豆豆成人网.com| 欧美无砖专区免费| 日韩毛片在线看| 色综合男人天堂| 国产福利久久久| 色94色欧美sute亚洲线路一ni| 97超碰在线视| 91精品丝袜国产高跟在线| 91成人在线免费视频| 亚洲精品国产成人av在线| 日韩精品电影在线| 白嫩亚洲一区二区三区| 爱福利一区二区| 91p0rn永久地址| 久久99视频精品| 久久免费视频网站| 韩国三级电影一区二区| 国产真实乱偷精品视频| 欧美~级网站不卡| 尤物99国产成人精品视频| 日韩精品久久久久久久的张开腿让| 四虎成人精品一区二区免费网站| 亚洲人人夜夜澡人人爽| 欧美黑人巨大xxxx猛交| 成人午夜一级二级三级| 天天操夜夜草| 亚洲av成人精品一区二区三区| 日韩电影免费观看在| 欧美成人a交片免费看| 亚洲熟女www一区二区三区| 在线观看一区二区三区三州| 农村寡妇一区二区三区| 久久亚洲二区| 美女露隐私免费网站| 香蕉视频黄色在线观看| 隔壁老王国产在线精品| 欧美日韩国产免费观看视频| 无码人妻精品一区二区蜜桃色欲| 四虎国产精品永久免费观看视频| 巨大黑人极品videos精品| 成人高清视频在线观看| 最近免费观看高清韩国日本大全| 制服.丝袜.亚洲.中文.综合| 91free张津瑜movies| 美女在线观看视频一区二区| 9797在线看片亚洲精品| 四虎成人精品一区二区免费网站| xxxx国产精品| 婷婷综合在线观看| 在线免费黄色网| 日本三级日本三级日本三级极| 精品三级久久久| 欧美午夜激情视频| 午夜精品久久久久久久星辰影院| 日韩不卡在线播放| 欧美激情一区二区三级高清视频| 国产精品一久久香蕉国产线看观看| 亚洲精品成人在线| 亚洲高清在线精品| 最近免费中文字幕大全免费版视频| 2020国产精品久久精品美国| 天海翼中文字幕| 国产免费一级| www.毛片| 浮妇高潮喷白浆视频| eeuss影院www在线播放| 国产日韩欧美视频| 午夜裸体女人视频网站在线观看| 欧美国产日韩a欧美在线观看| 国产精品密蕾丝视频下载| 国产绿帽刺激高潮对白| 在线精品国精品国产尤物884a| 国产亚洲精品自拍| 91嫩草|国产丨精品入口| 欧美色老头old∨ideo| 久久男人资源站| 欧美亚洲激情视频| 国产最新视频在线观看| 波多野结衣在线播放| 日韩专区欧美专区| 在线看免费毛片| 欧美在线观看不卡| 午夜亚洲激情| 大陆精大陆国产国语精品| 国产麻豆精品在线观看| 91香蕉视频导航| 91制片厂毛片| 日本中文字幕在线观看视频| 国产成人精品网址| h网站在线播放| 四虎影在永久在线观看| 超级碰在线观看| 一区二区三区成人| 成人无码av片在线观看| 亚洲日本乱码在线观看| 性xxxxfreexxxxx欧美丶| 国产影视一区二区| 青青草自拍偷拍| 六月丁香婷婷激情| 淫视频在线观看| 韩国精品主播一区二区在线观看| 亚洲国产日韩在线一区模特| 精品精品国产毛片在线看| 日韩欧美一区二区三区免费看| 国产精品蜜臀| 一区二区精品区| 精品一级毛片| 天堂网www在线资源中文| 日韩精品中文在线观看| 91麻豆精品国产91久久久久| 日韩色性视频| 国产精品久久久久久久久夜色| 国产毛片精品| 蜜臀av性久久久久蜜臀aⅴ| 超碰人人cao| 一级片视频在线观看| 推川ゆうり中文亚洲二区| 亚洲欧美色图片| 麻豆精品一区二区av白丝在线| 色播色播色播色播色播在线| 日韩专区在线视频| 欧美精品在欧美一区二区| 欧美激情综合色综合啪啪| 性感美女极品91精品| 免费人成在线观看视频播放| 91精品国产成人www| 国产成人av网址| 可以在线观看的黄色网址| 国产三区在线视频| 自拍另类欧美| 这里只有精品免费视频| 国产午夜精品一区理论片飘花| 免费在线看黄| 在线播放日韩av| jizz亚洲大全| 黄色美女视频在线观看| 人在线成免费视频| 一区二区三区亚洲视频| 欧美精美视频| 国产美女视频网站| 欧美日韩视频在线播放| 亚洲欧美在线播放| 国产精品一区二区三区久久久| √天堂8资源中文在线| 色播亚洲视频在线观看| 你懂的视频在线观看| 亚洲一区二区三区四区中文| 国产精品18久久久久久久久| 国产成人啪精品视频免费网| 在线观看视频h| 超薄肉色丝袜足j调教99| 国产精品久久观看| 中国特级黄色大片| 黄色av免费看| 蜜桃999成人看片在线观看| 美国十次了思思久久精品导航| 麻豆免费版在线观看| av一区二区三区四区| 日韩小视频网址| 精品久久成人| 成年人视频在线免费观看| 在线中文视频| 激情都市一区二区| 国产精品333| 成人黄网大全在线观看| 精品国产伦一区二区三区观看方式| 国产污片在线观看| 天堂8中文在线| 涩涩漫画在线观看| 欧美黑人性猛交xxx| 国内自拍视频在线看免费观看| 久久美女精品| aaa一级毛片| 欧美亚洲日本网站| 竹菊久久久久久久| 99精品视频国产| 国产一级黄色大片| 免费a级片网站| 亚洲无限av看| 性一交一乱一色一视频麻豆| 免费在线稳定资源站| 欧美色图综合网| 国产精品日韩精品在线播放| 亚洲国产精品综合| 美女一区二区久久| 国产免费黄色一级片| av亚洲精华国产精华| 久久九九热免费视频| 国产成人免费在线| 51漫画成人app入口| 亚洲AV无码成人精品区东京热| 交换做爰国语对白| 欧美成人观看免费全部完小说| 五月婷婷欧美视频| 欧美做爰性欧美大fennong| 91视频一区二区三区| 亚洲综合网站久久久| 99在线精品免费视频| 男人先锋资源| 亚洲精品乱码久久久久久久久| 天天做天天爱夜夜爽| 久久久精品毛片| 天天爱天天干天天操| 欧美区二区三区| 免费国产成人av| 国产99久久久久久免费看农村| 黄色工厂在线观看| 成年美女网站| 国语对白做受xxxxx在线中国| 久久久精品久久| 国产在线视频卡一卡二| 黄网站app在线观看| 日本精品一区在线观看| 久久久电影一区二区三区| 欧美激情国内偷拍| 热色播在线视频| 色国产在线视频| 日韩av毛片网| 日韩欧美第一页| 在线亚洲一区| 亚洲精品v亚洲精品v日韩精品| 欧美一区午夜精品| 国产精品久久色| 玖玖精品在线| av日韩在线播放| 亚洲欧美中文日韩在线v日本| 日本欧美韩国一区三区| 国产精品久久久久久久一区探花| 欧美日韩一区二区三区在线观看免| 亚洲精品一线二线三线| 免费a视频在线观看| 无码人妻精品一区二区蜜桃色欲| 动漫精品一区二区三区| 最近中文视频在线| 亚洲欧洲精品天堂一级| 日本精品一区二区三区在线播放视频| 日本伊人精品一区二区三区介绍| 成人av网站观看| 中文字幕永久在线不卡| 51社区在线成人免费视频| 一道本无吗一区| 中文字幕国语官网在线视频| 国产精品国产三级国产aⅴ中文| 22288色视频在线观看| 中文乱码人妻一区二区三区视频| xfplay资源站夜色先锋5566| 久久久久久久久久久久久久av| 国产成人亚洲综合| 欧美日韩国产精品一区二区|