亚洲免费不卡_在线视频精品_国产尤物精品_久久久久网址_久久精品91_欧美va天堂在线_狠狠入ady亚洲精品_亚洲午夜精品福利_国产精品草草_午夜精品久久99蜜桃的功能介绍

ASP.NET Web API標準的“管道式”設計
來源:易賢網 閱讀:1127 次 日期:2014-08-28 14:40:19
溫馨提示:易賢網小編為您整理了“ASP.NET Web API標準的“管道式”設計”,方便廣大網友查閱!

ASP.NET Web API的核心框架是一個消息處理管道,這個管道是一組HttpMessageHandler的有序組合。這是一個雙工管道,請求消息從一端流入并依次經過所有HttpMessageHandler的處理。在另一端,目標HttpController被激活,Action方法被執行,響應消息隨之被生成。響應消息逆向流入此管道,同樣會經過逐個HttpMessageHandler的處理。這是一個獨立于寄宿環境的抽象管道,如何實現對請求的監聽與接收,以及將接收的請求傳入消息處理管道進行處理并將管道生成的響應通過網絡回傳給客戶端,這就是Web API寄宿需要解決的問題。

目錄

一、HttpMessageHandler

二、DelegatingHandler

三、HttpServer

四、HttpRoutingDispatcher

五、HttpControllerDispatcher

一、HttpMessageHandler

ASP.NET Web API的消息處理管道由一組HttpMessageHandler經過“首尾相連”而成,ASP.NET Web API之所以具有較高的可擴展性,主要源于采用的管道式設計。雖然ASP.NET Web API框架旨在實現針對請求的處理和響應的回復,但是采用的處理策略因具體的場景而不同。

我們不可能也沒有必要創建一個“萬能”的處理器來滿足所有的請求處理需求,倒不如讓某個處理器只負責某個單一的消息處理功能。在具體的應用場景中,我們可以根據具體的消息處理需求來選擇所需的處理器并組成一個完整的消息處理管道。在這里這個用于完成某個單一消息處理功能的處理器就是HttpMessageHandler。

這里的“消息處理”具有兩個層面的含義,既包括針對請求消息的處理,還包括針對響應消息的處理。HttpMessageHandler直接或者間接繼承自具有如下定義的抽象類型HttpMessageHandler,該類型定義在命名空間“System.Net.Http”下。ASP.NET Web API通過類型HttpRequestMessage和HttpResponseMessage來表示管道處理的請求消息和響應消息,所以對HttpMessageHandler的定義就很好理解了。

1: public abstract class HttpMessageHandler : IDisposable

2: {

3: public void Dispose();

4: protected virtual void Dispose(bool disposing);

5: protected abstract Task SendAsync(HttpRequestMessage request, CancellationToken cancellationToken);

6: }

如上面的代碼片斷所示,抽象類HttpMessageHandler定義了一個受保護的抽象方法SendAsync,這是一個采用針對Task的“并行編程模式”的異步方法,在后續的章節中我們會看到ASP.NET Web API的應用程序接口基本上都采用這樣的定義方式。對于這個SendAsync方法來說,request參數表示傳遞給當前HttpMessageHandler進行處理的請求,這是一個HttpRequestMessage對象。另一個參數cancellationToken是一個用于發送取消操作信號的CancellationToken對象,如果讀者對.NET中的并行編程具有基本了解的話,相信對這個類型不會感到陌生。

針對請求消息和響應消息的處理均體現在這個SendAsync方法上。具體來說,針對請求消息的處理直接實現在SendAsync方法中,而針對響應消息的處理則通過其返回的Task對象來完成。由HttpMessageHandler組成的消息處理管道以及請求消息和響應消息在管道中的“流動”基本上可以通過右圖來體現。

抽象類HttpMessageHandler實現了IDisposable接口,它按照“標準”的方式實現Dispose方法。如下面的代碼片斷所示,當我們調用Dispose方法的時候,HttpMessageHandler并沒有執行任何資源回收操作。當我們通過繼承這個抽象類自定義HttpMessagHandler的時候,可以將資源回收操作實現在重寫的Dispose方法中。

1: public abstract class HttpMessageHandler : IDisposable

2: {

3: //其他操作

4: public void Dispose()

5: {

6: this.Dispose(true);

7: GC.SuppressFinalize(this);

8: }

9:

10: protected virtual void Dispose(bool disposing)

11: {}

12: }

二、DelegatingHandler

我們說ASP.NET Web API消息處理管道是通過一組有序的HttpMessagHandler“首尾相連”而成,具體實現“管道串聯”是通過DelegatingHandler這個類型來完成的。顧名思義,DelegatingHandler具有委托功能,當它自己負責的消息處理任務完成之后可以委托另一個HttpMessagHandler進行后續的處理。如果這個被委托的也是一個DelegatingHandler對象,不就可以組成一個委托鏈了嗎?而這個委托鏈不就是由一個個DelegatingHandler組成的消息處理管道嗎?

如下面的代碼片斷所示,DelegatingHandler是一個繼承自HttpMessageHandler類的抽象類。上面我們所說的這個被委托的HttpMessagHandler由它的屬性InnerHandler表示。DelegatingHandler重寫了定義在其類的抽象方法SendAsync來調用InnerHandler屬性的同名方法。

1: public abstract class DelegatingHandler : HttpMessageHandler

2: {

3: protected internal override Task SendAsync(HttpRequestMessage request, CancellationToken cancellationToken);

4: public HttpMessageHandler InnerHandler get; set; }

5: }

正如上面所說,如果ASP.NET Web API的消息處理管道均由DelegatingHandler組成(位于管道尾端的HttpMessageHandler除外),我們就可以根據其InnerHandler獲得對被委托的HttpMessageHandler對象的引用,由此便構成具有如上圖所示的鏈式結構。組成ASP.NET Web API核心框架的消息處理管道就這么簡單。

三、HttpServer

一般來說,對于構成ASP.NET Web API消息處理管道的所有HttpMessageHandler來說,除了處于尾端的那一個之外,其余的均為DelegatingHandler,那么通過InnerHandler屬性維持著“下一個” HttpMessageHandler。作為這個HttpMessageHandler鏈“龍頭”的是一個HttpServer對象,該類型定義在命名空間“System.Web.Http”下。

如下面的代碼片斷所示,HttpServer直接繼承自DelegatingHandler。它具有兩個重要的只讀屬性(Configuration和Dispatcher),我們可以通過前者得到用于配置整個消息處理管道的HttpConfiguration對象,另外一個屬性Dispatcher返回的是處于整個消息處理管道“尾端”的HttpMessageHandler。

1: public class HttpServer : DelegatingHandler

2: {

3: public HttpConfiguration Configuration { get; }

4: public HttpMessageHandler Dispatcher { get; }

5:

6: public HttpServer();

7: public HttpServer(HttpMessageHandler dispatcher);

8: public HttpServer(HttpConfiguration configuration);

9: public HttpServer(HttpConfiguration configuration, HttpMessageHandler dispatcher);

10:

11: protected override void Dispose(bool disposing);

12: protected virtual void Initialize();

13: protected override Task SendAsync(HttpRequestMessage request, CancellationToken cancellationToken);

14: }

HttpServer的Configuration和Dispatcher屬性均可以在相應的構造函數中初始化。如果在構造HttpServer的時候沒有顯式指定這兩個屬性的值(調用默認的無參構造函數創建HttpServer),在默認情況下會創建一個HttpConfiguration作為Configuration的屬性值,而作為Dispatcher屬性值的則是一個HttpRoutingDispatcher對象,該類型定義在命名空間“System.Web.Http.Dispatcher”下。除此之外。由于HttpConfiguration類型實現了IDisposable接口,所以HttpServer重寫了虛方法Dispose并在該方法中完成了對HttpConfiguration對象的釋放。

當HttpServer對象被成功創建之后,對應的消息處理管道的“一頭一尾”已經確定下來。一頭指的就是HttpServer對象本身,一尾指的自然就是通過Dispatcher屬性引用的HttpMessageHandler對象了。ASP.NET Web API框架最大的擴展性就在于我們可以根據具體的消息處理需求來“定制”這個消息處理管道,它允許我們將自定義的HttpMessageHandler按照如左圖所示的方式“安裝”到這一頭一尾之間,但是這些處于“中間位置”的HttpMessageHandler是如何注冊呢?

既然整個管道都是由HttpConfiguration進行配置,那么自定義HttpMessageHandler的注冊自然也可以利用它來完成。如下面的代碼片斷所示,HttpConfiguration具有一個只讀的集合類型的MessageHandlers,需要注冊的HttpMessageHandler需要添加到此集合之中。由于這是一個元素類型為DelegatingHandler的集合,所以我們自定義的HttpMessageHandler必須繼承自DelegatingHandler。

1: public class HttpConfiguration : IDisposable

2: {

3: //其他成員

4: public Collection MessageHandlers { get; }

5: }

通過上面的給出的HttpServer類型定義我們可以看到它具有一個受保護的Initialize方法,該方法最終完成了對整個消息處理管道的構建。在重寫的SendAsync方法中,如果自身尚未被初始化,該Initialize方法會自動被調用以確保整個消息處理管道已經被成功構建。

四、HttpRoutingDispatcher

在默認情況下,作為消息處理管道“龍頭”的HttpServer的Dispatcher屬性返回一個HttpRoutingDispatcher對象,它可以視為這個消息處理管道的最后一個HttpMessageHandler。Web API調用請求一般都是針對定義在某個HttpController中的某個Action方法,所以消息處理管道最終需要激活相應的HttpController并執行對應的Action方法,HttpRoutingDispatcher完成了目標HttpController的激活和Action方法的執行。

如下面的代碼片斷所示,HttpRoutingDispatcher不再是DelegatingHandler的繼承者,它的直接基類是抽象類HttpMessageHandler。我們在構建一個HttpRoutingDispatcher對象的時候需要指定一個HttpConfiguration對象,而通過參數defaultHandler指定的HttpMessageHandler對于創建的HttpRoutingDispatcher對象來說具有重要的意義,因為HttpController的激活、Action方法的選擇與執行等后續操作實際上是由它來完成的。

1: public class HttpRoutingDispatcher : HttpMessageHandler

2: {

3: public HttpRoutingDispatcher(HttpConfiguration configuration);

4: public HttpRoutingDispatcher(HttpConfiguration configuration, HttpMessageHandler defaultHandler);

5:

6: protected override Task SendAsync(HttpRequestMessage request, CancellationToken cancellationToken);

7: }

雖然ASP.NET Web API消息處理管道不具有一個類似于HttpContext的對象來保存基于當前請求的上下文信息,但是表示請求消息的HttpRequestMessage對象具有一個通過Properties屬性表示的屬性字典,我們可以利用它來作為上下文數據的存放容器。

通過上面對HttpServer的介紹我們知道它會將當前SynchronizationContext和HttpConfiguration添加到表示當前請求的HttpRequestMessage對象的屬性字典中。與之類似,通過路由系統生成的HttpRouteData也以同樣的方式保存在HttpRequestMessage的屬性字典之中,我們可以直接調用HttpRequestMessage的如下兩個擴展方法GetRouteData和SetRouteData進行HttpRouteData的獲取和設置。

1: public static class HttpRequestMessageExtensions

2: {

3: //其他成員

4: public static IHttpRouteData GetRouteData(this HttpRequestMessage request);

5: public static void SetRouteData(this HttpRequestMessage request, IHttpRouteData routeData);

6: }

HttpRoutingDispatcher的SendAsync方法被執行時,它會判斷作為參數的HttpRequestMessage對象的屬性字典中是否具有這樣一個HttpRouteData對象。如果此HttpRouteData對象存在,它會直接將請求交付給創建時指定的HttpMessageHandler進行處理。這樣的情況會發生在Web Host寄宿模式下。

如果封裝路由數據的HttpRouteData對象尚未添加到表示被處理請求的HttpRequestMessage對象的屬性字典中,意味著針對請求的路由尚未發生,這種情況會發生在Self Host寄宿模式下。在這種情況下,HttpRoutingDispatcher會直接通過當前HttpConfiguration的Routes屬性得到全局路由表,并將HttpRequestMessage對象作為參數調用其GetRouteData方法以實現針對當前請求的路由解析。

如果執行路由表的GetRouteData方法返回一個具體的HttpRouteData對象,意味著當前請求與注冊的某個HttpRoute相匹配,HttpRoutingDispatcher會將這個HttpRouteData對象添加到HttpRequestMessage對象的屬性字典中。在這之后,ASP.NET Web API會將請求交付給創建時指定的HttpMessageHandler進行后續處理。如果執行GetRouteData方法返回Null,意味著當前請求與注冊的路由規則不匹配,客戶端會得到一個狀態為“404, Not Found”的響應。

五、HttpControllerDispatcher

我們從類型命名可以看出HttpRoutingDispatcher具有兩個基本的職能,即“路由(Routing)”和“消息分發(Dispatching)”。對于前者,它會調用當前路由表對請求消息實施路由解析進而生成用于封裝路由數據的HttpRouteData(如果這樣的HttpRouteData不存在于當前請求的屬性字典中)。對于后者,它會將請求直接分發給在創建時指定的HttpMessageHandler來完成進一步處理。

如果在構建HttpRoutingDispatcher對象的時候沒有通過參數defaultHandler顯式指定這么一個HttpMessageHandler對象,默認情況下從它手中接管請求的HttpMessageHandler是一個具有如下定義的HttpControllerDispatcher的對象,該類型定義在命名空間“System.Web.Http.Dispatcher”下。HttpControllerDispatcher在整個消息處理管道中顯得尤為重要,因為目標HttpController的激活、Action方法的執行和響應生成均是由HttpControllerDispatcher來完成的。

1: public class HttpControllerDispatcher : HttpMessageHandler

2: {

3: public HttpControllerDispatcher(HttpConfiguration configuration);

4: protected override Task SendAsync(HttpRequestMessage request, CancellationToken cancellationToken);

5:

6: public HttpConfiguration Configuration { get; }

7: }

在我們引入HttpControllerDispatcher對象之后,ASP.NET Web API的消息處理管道將具有如右圖所示的結構。從這個結構來看,貌似HttpControllerDispatcher才是整個消息處理管道的最后一個HttpMessageHandler。這種說法沒有錯,但我個人還是傾向于將HttpControllerDispatcher視為“隸屬于” HttpRoutingDispatcher的“內部”HttpMessageHandler,所以仍將這個“包含” HttpControllerDispatcher的HttpRoutingDispatcher視為組成消息處理管道的最后一個HttpMessageHandler。

除此之外,“N個DelegagingHandler + 1個HttpMessageHander”這樣的鏈式結構也剛好與基于DelegagingHandler的委托鏈相匹配。對于讀者朋友來說,具體傾向于哪種說法并不重要,重要的是能夠深刻了解整個消息處理管道的是如何構成的。

更多信息請查看IT技術專欄

更多信息請查看網絡編程
易賢網手機網站地址:ASP.NET Web API標準的“管道式”設計
由于各方面情況的不斷調整與變化,易賢網提供的所有考試信息和咨詢回復僅供參考,敬請考生以權威部門公布的正式信息和咨詢為準!
關于我們 | 聯系我們 | 人才招聘 | 網站聲明 | 網站幫助 | 非正式的簡要咨詢 | 簡要咨詢須知 | 新媒體/短視頻平臺 | 手機站點

版權所有:易賢網

亚洲免费不卡_在线视频精品_国产尤物精品_久久久久网址_久久精品91_欧美va天堂在线_狠狠入ady亚洲精品_亚洲午夜精品福利_国产精品草草_午夜精品久久99蜜桃的功能介绍
亚洲经典在线| 亚洲综合国产激情另类一区| 日韩午夜av| 一区二区三区四区五区精品视频| 一区二区三区国产在线| 亚洲欧美日韩精品在线| 欧美成人综合| 国产一区二区三区奇米久涩| 久久久久久9| 国模一区二区三区| 亚洲一区欧美二区| 狠狠色伊人亚洲综合网站色| 国产区二精品视| 欧美在线视频二区| 亚洲伦理一区| 欧美精品黄色| 亚洲欧美国产精品桃花| 狠狠色综合网| 欧美ab在线视频| 国产精品美女xx| 禁久久精品乱码| 午夜一区不卡| 在线亚洲成人| 黄色亚洲在线| 欧美精品aa| 香蕉国产精品偷在线观看不卡| 韩日视频一区| 午夜精品免费| 欧美一区2区三区4区公司二百| 99国内精品久久久久久久软件| 欧美精品尤物在线| 美女日韩在线中文字幕| 国产欧美日本在线| 亚洲日本欧美| 亚洲国产第一| 在线视频观看日韩| 激情国产一区| 国产精品国产三级国产专区53| 美女诱惑黄网站一区| 99视频+国产日韩欧美| 亚洲无毛电影| 亚洲第一在线| 亚洲国内自拍| 亚洲精品影院| 日韩视频中文| 国产精品色网| 免费在线成人av| 久久久福利视频| 老司机午夜精品视频| 午夜亚洲视频| 久久综合一区| 欧美日韩综合网| 欧美亚洲不卡| 亚洲精品一区二区三| 美脚丝袜一区二区三区在线观看| 国产欧美三级| 欧美在线播放一区| 欧美精品福利| 亚洲黄色在线| 西西裸体人体做爰大胆久久久| 亚洲一区二区三区四区中文| 久久久久se| 黄色成人精品网站| 国产日韩精品视频一区二区三区| 国产视频在线观看一区| 久久国产精品久久久久久电车| 久久国产精品一区二区三区四区| 久久亚洲国产精品一区二区| 好看的日韩av电影| 在线亚洲自拍| 欧美日本韩国在线| 国产一区二区精品| 欧美精品二区| 午夜亚洲伦理| 好吊视频一区二区三区四区| 亚洲一卡久久| 亚洲黄色一区| 欧美极品一区| 免费国产自线拍一欧美视频| 亚洲无线视频| 久久看片网站| 亚洲精品国产日韩| 欧美jjzz| 美日韩免费视频| 亚洲区一区二区三区| 欧美黄色免费| 久久精品观看| 国产精品推荐精品| 亚洲三级免费| 伊人精品视频| 欧美午夜视频| 欧美成人有码| 麻豆成人精品| 国产精品一区在线观看| 在线不卡欧美| 在线成人国产| 禁久久精品乱码| 欧美视频网站| 欧美日韩hd| 玖玖玖国产精品| 亚洲一区二区三区四区中文 | 亚洲国产欧美不卡在线观看| 亚洲欧美日韩在线观看a三区| 精品电影一区| 国产精品多人| 欧美日韩精品| 欧美婷婷在线| 国产精品jizz在线观看美国| 久久久久国产精品一区二区| 亚洲欧美大片| 久久福利一区| 久久国产成人| 你懂的视频一区二区| 亚洲一区二区三区高清| 国产精品女主播一区二区三区| 韩日成人av| 亚洲大胆av| 亚洲国产影院| 国产亚洲午夜| 亚洲欧美日韩视频二区| 欧美资源在线| 久久一区中文字幕| 欧美久久一级| 精品999日本| 99国产精品视频免费观看一公开 | 久久精品人人| 欧美一区影院| 国内精品99| 亚洲福利久久| 99国产精品视频免费观看一公开 | 亚洲黄色免费| 亚洲精品日本| 国产精品丝袜xxxxxxx| 性欧美xxxx大乳国产app| 先锋影音国产一区| 欧美日韩免费观看一区=区三区| 欧美精品一区在线| 国内精品亚洲| 国产嫩草一区二区三区在线观看| 久久久久国产精品一区二区| 欧美视频福利| 国产日韩一区欧美| 欧美一区精品| 亚洲毛片视频| 久久久综合香蕉尹人综合网| 亚洲午夜精品久久久久久浪潮| 亚洲久色影视| 欧美高清不卡| 国产精品亚洲一区| 欧美激情第六页| 亚洲久久一区二区| 欧美精品激情| 国产色综合网| 国内精品久久久久久久97牛牛| 在线一区欧美| 国内成+人亚洲| 亚洲欧美视频| 99成人免费视频| 国产精品sm| 国产精品一级| 激情久久综合| 欧美fxxxxxx另类| 国产精品推荐精品| 亚洲福利一区| 欧美亚州在线观看| 久久亚洲高清| 免费永久网站黄欧美| 亚洲国产一区在线| 国产精品久久7| 久久中文精品| 亚洲永久免费精品| 亚洲精品字幕| 91久久夜色精品国产九色| 欧美片第1页综合| 久久精品亚洲| 久久xxxx| 久久aⅴ国产紧身牛仔裤| 日韩亚洲视频在线| 黄色一区三区| 亚洲午夜精品福利| 亚洲午夜极品| 黄色另类av| 欧美少妇一区| 黑人一区二区三区四区五区| 欧美色综合网| 国产真实久久| 国产综合自拍| 亚洲无吗在线| 亚洲欧洲日本国产| 亚洲电影在线| 亚洲另类黄色| 国产区欧美区日韩区| 亚洲深夜激情| 国产精品久久久久久久久久直播| 亚洲精品乱码| 99精品国产高清一区二区 | 亚洲国产影院| 亚洲区一区二| 亚洲精品专区| 国产日韩欧美一区二区| 国产亚洲福利| 先锋影音久久| 午夜视频久久久| 欧美日韩一区二区三区在线观看免| 午夜日韩视频| 亚洲二区三区四区| 国产日韩欧美一区| 久久久久久久久一区二区| 欧美久久99| 亚洲狼人精品一区二区三区| 国产精品日韩欧美一区二区| 久久免费99精品久久久久久| 欧美日韩一区二区三区四区在线观看| 亚洲天堂成人| 国产欧美精品久久| 欧美在线播放| 亚洲福利专区| 噜噜噜躁狠狠躁狠狠精品视频| 欧美精品一区二区视频| 最近看过的日韩成人| 香蕉久久夜色精品国产| 欧美天天视频| 国产精品夜夜夜| 国产综合婷婷| 亚洲一区精彩视频| 国色天香一区二区| 亚洲欧美日韩一区在线观看| 国内精品久久久久久久影视蜜臀| 在线一区亚洲| 国内精品久久久久久久97牛牛| 夜久久久久久| 国产专区一区| 久久久久久久高潮| 日韩午夜免费视频| 欧美成人久久| 国产美女诱惑一区二区| 影音先锋中文字幕一区| 欧美一区激情视频在线观看| 亚洲精品1区2区| 欧美人与禽猛交乱配视频| 国产精品久久久久久模特 | 在线精品观看| 女生裸体视频一区二区三区| 国产视频一区在线观看一区免费| 国内精品99| 欧美1级日本1级| 亚洲影视综合| 国产偷自视频区视频一区二区| 黄色成人av网站| 欧美日韩国产探花| 久久综合激情| 久久一区二区精品| 欧美亚洲一区二区三区| 一区二区三区|亚洲午夜| 影音先锋久久精品| 亚洲婷婷在线| 一区三区视频| 黑人一区二区三区四区五区| 欧美在线观看天堂一区二区三区| 国产免费成人| 中文亚洲字幕| 一本色道久久综合亚洲精品婷婷 | 亚洲精品在线二区| 在线欧美福利| 亚洲精品一区二区三区av| 亚洲国产一区二区三区在线播| 黄色工厂这里只有精品| 很黄很黄激情成人| 亚洲国产日韩美| 亚洲毛片网站| 亚洲一区日韩| 久久久一二三| 国产精品国产三级国产专区53| 欧美视频福利| 在线观看成人一级片| 狠狠色综合网| 99国内精品| 久久xxxx精品视频| 欧美另类视频| 亚洲久久视频| 久久国产一区二区| 欧美精品观看| 亚洲另类自拍| 久久久水蜜桃| 在线观看欧美一区| 国产区欧美区日韩区| 久久不射网站| 欧美日韩亚洲一区三区 | 亚洲综合三区| 久久青青草综合| 国语精品中文字幕| 国产欧美另类| 欧美破处大片在线视频| 亚洲国产精品视频一区| 亚洲制服av| 国内精品久久久久久久97牛牛 | 亚洲国产精品久久久久久女王| 亚洲国产一区二区精品专区| 亚洲一区二区三区免费观看| 老妇喷水一区二区三区| 亚洲国产精品第一区二区三区| 99精品国产99久久久久久福利| 噜噜噜91成人网| 精品成人在线| 你懂的一区二区| 中日韩男男gay无套| 欧美精品97| 亚洲欧美视频| 亚洲免费精品| 欧美日韩一区二区视频在线观看| 国产视频亚洲| 影音先锋日韩资源| 欧美一区二区三区四区在线观看地址 | 一本一本久久a久久精品综合妖精| 国产精品裸体一区二区三区| 欧美三级在线| 久久天堂成人| 免费亚洲视频| 国产精品毛片在线| 亚洲高清视频在线观看| 巨乳诱惑日韩免费av| 亚洲尤物影院| 国产一级久久| 日韩午夜在线| 亚洲清纯自拍| 亚洲第一在线综合在线| 欧美日本一区| 午夜视频精品| 牛牛国产精品| 久久久福利视频| 奶水喷射视频一区| 亚洲欧美国产精品桃花| 国产一区二区三区免费不卡| 99热在线精品观看| 国内精品福利| 黑人中文字幕一区二区三区| 欧美精品麻豆| 你懂的网址国产 欧美| 久久午夜视频| 欧美一区二区视频在线| 葵司免费一区二区三区四区五区| 亚洲伊人网站| 欧美亚洲免费| 久久天堂国产精品| 欧美不卡视频| 欧美精品一区三区在线观看| 欧美成人69av| 国产一区自拍视频| 伊人蜜桃色噜噜激情综合| 亚洲激情黄色| 国产精品亚洲不卡a| 久久xxxx精品视频| 午夜精品区一区二区三| 欧美日韩免费观看一区| 国产一区免费视频| 亚洲成人资源| 国产精品日本一区二区 | 午夜激情一区| 国产精品二区影院| 黑丝一区二区| 国产日韩精品久久| 久久人人97超碰人人澡爱香蕉| 欧美精品aa| 日韩一区二区免费看| 老司机一区二区三区| 欧美精品aa| 亚洲免费大片| 免费久久99精品国产自| 欧美国产另类| 亚洲精品一区二区三区av| 西西人体一区二区| 黄色一区二区三区四区| 亚洲一区二区在| 黑人一区二区| 午夜亚洲精品| 黄色日韩精品| 蜜桃av综合| 在线观看亚洲视频啊啊啊啊| 国产亚洲毛片| 韩日精品视频| 久久精品官网| 亚洲啪啪91| 欧美在线二区| 国产精品日韩久久久| 国产精品xvideos88| 国产精品日韩欧美一区| 狠狠色综合一区二区| 久久久久国内| 国产精品日韩一区二区| 国内精品久久久久久久97牛牛 | 在线亚洲自拍| 韩日精品在线| 狂野欧美一区| 国产精品毛片在线看| 精品动漫3d一区二区三区免费| 乱人伦精品视频在线观看| 亚洲欧洲另类| 激情久久中文字幕| 欧美日韩视频一区二区三区| 男人的天堂亚洲在线|