精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

淺議 C# 客戶端和服務端通信的幾種方法: Rest 和 Grpc 和其他

開發 后端
在C#客戶端和C#服務器之間進行通信的方法有很多。一些功能強大,而其他功能則不是很多。有些非常快,有些則不是。知道不同的選擇很重要,這樣您才能決定最適合自己的選擇。

在C#客戶端和C#服務器之間進行通信的方法有很多。一些功能強大,而其他功能則不是很多。有些非常快,有些則不是。知道不同的選擇很重要,這樣您才能決定最適合自己的選擇。

本文將介紹當今最流行的技術,以及為何如此廣泛地使用它們。我們將討論REST,gRPC及其兩者之間的所有內容。

最佳方案

讓我們考慮一下我們希望如何在最佳環境中使客戶端與服務器之間的通信看起來像。我在想像這樣的東西:

  1. // on client side 
  2. public void Foo() 
  3.     var server = new MyServer(new Uri("https://www.myserver.com/");) 
  4.     int sum = server.Calculator.SumNumbers(12,13);  
  1. // on server side 
  2. class CalculatorController : Controller{ 
  3.     public int SumNumbers(int a, int b) 
  4.     { 
  5.         return a + b; 
  6.     } 

我當然想要完整的Intellisense。當我單擊server并. 希望Visual Studio顯示所有控制器時。當我單擊CalculatorController和時.,我想查看所有操作。我還想要一流的性能,很少的網絡負載和雙向通信。而且我想要一個能夠完美處理版本控制的強大系統,這樣我就可以毫不費力地部署新的客戶端版本和新的服務器版本。

要求太多嗎?

請注意,我在這里談論的是無狀態API。這等效于C#項目,其中只有兩種類型的類:

?靜態類,只有靜態方法。

?POCO類[1]僅具有類型為基本類型或其他POCO類的字段和屬性。

在API中使用狀態會帶來復雜性,而這正是萬惡之源。因此,為了本文的方便,讓我們保持美好和無狀態。

傳統REST

REST API出現在2000年代初期,席卷了整個互聯網。到目前為止,它是創建Web服務的最流行的方法。

REST為客戶端到服務器的請求定義了一組固定的操作GET,POST,PUT和DELETE。每個請求都將通過包含有效負載(通常為JSON)的響應來回答。請求包含在查詢本身中的參數,或者在它是POST請求時包含為有效負載(通常為JSON)的參數。

有一個稱為RESTful API的標準,它定義了以下規則(您實際上不必使用它):

  • GET用于檢索資源
  • PUT用于更改資源狀態
  • POST用于創建資源
  • DELETE用于刪除資源

如果您到目前為止還不熟悉REST,則上面的解釋可能不會減少它,因此這里有一個示例。在.NET中,內置了對REST的支持。實際上,默認情況下,ASP.NET Web API被構建為REST Web服務。這是典型的客戶端和ASP.NET服務器的外觀:

在服務器中:

  1. [Route("People")] 
  2. public class PeopleController : Controller 
  3.     [HttpGet] 
  4.     public Person GetPersonById(int id) 
  5.     { 
  6.         Person person = _db.GetPerson(id); 
  7.         return person;//Automatically serialized to JSON 
  8.     } 
  9. }    

在客戶中:

  1. var client = new HttpClient(); 
  2. string resultJson =  
  3.     await client.GetStringAsync("https://www.myserver.com/People/GetPersonById?id=123"); 
  4. Person person = JsonConvert.DeserializeObject<Person>(resultJson); 

REST非常方便,但是并沒有達到最佳方案。因此,讓我們看看是否可以做得更好。

ReFit

ReFit不能替代REST。相反,它建立在REST之上,并允許我們像調用簡單方法一樣調用服務器端點。這是通過在客戶端和服務器之間共享接口來實現的。在服務器端,您的控制器將實現一個接口:

  1. public interface IMyEmployeeApi 
  2.     [Get("/employee/{id}")] 
  3.     Task<Employee> GetEmployee(string id); 

然后,在客戶端,您需要包括相同的接口并使用以下代碼:

  1. var api = RestService.For<IMyEmployeeApi>("https://www.myserver.com"); 
  2. var employee = await api.GetEmployee("abc"); 

就這么簡單。除了幾個NuGet軟件包外,無需運行困難的自動化程序或使用任何第三方工具。

這更接近最佳方案。現在,我們有了IntelliSense,并且客戶端和服務器之間的合同很牢固。但是還有另一種選擇,在某些方面甚至更好。

昂首闊步

像ReFit一樣,Swagger也建立在REST之上。OpenAPI[2]或Swagger是REST API的規范。它描述了具有簡單JSON文件的REST Web服務。這些文件是Web服務的API架構。它們包括:

?API中的所有路徑(URL)。

?每個路徑的預期操作(GET,POST等)。每個路徑可以處理不同的操作。例如,單個路徑https://mystore.com/Product可能接受添加產品的POST操作和返回產品的GET操作。

  • 每個路徑和操作的預期參數。
  • 每個路徑的預期響應。
  • 每個參數和響應對象的類型。

該JSON文件實質上是客戶端和服務器之間的合同。這是一個描述一個稱為Swagger Petstore[3]的Web服務的swagger文件的示例(為清楚起見,我刪除了一些部分):

  1. {  
  2.    "swagger":"2.0"
  3.    "info":{  
  4.       "version":"1.0.0"
  5.       "title":"Swagger Petstore"
  6.       "description":"A sample API that uses a petstore as an example to demonstrate features in the swagger-2.0 specification"
  7.    }, 
  8.    "host":"petstore.swagger.io"
  9.    "basePath":"/api"
  10.    "schemes":[  
  11.       "http" 
  12.    ], 
  13.    "consumes":[  
  14.       "application/json" 
  15.    ], 
  16.    "produces":[  
  17.       "application/json" 
  18.    ], 
  19.    "paths":{  
  20.       "/pets":{  
  21.          "get":{  
  22.             "description":"Returns all pets from the system that the user has access to"
  23.             "operationId":"findPets"
  24.             "produces":[  
  25.                "application/json"
  26.                "application/xml"
  27.             ], 
  28.             "parameters":[  
  29.                {  
  30.                   "name":"tags"
  31.                   "in":"query"
  32.                   "description":"tags to filter by"
  33.                   "required":false
  34.                   "type":"array"
  35.                   "items":{  
  36.                      "type":"string" 
  37.                   }, 
  38.                   "collectionFormat":"csv" 
  39.                }, 
  40.                {  
  41.                   "name":"limit"
  42.                   "in":"query"
  43.                   "description":"maximum number of results to return"
  44.                   "required":false
  45.                   "type":"integer"
  46.                   "format":"int32" 
  47.                } 
  48.             ], 
  49.             "responses":{  
  50.                "200":{  
  51.                   "description":"pet response"
  52.                   "schema":{  
  53.                      "type":"array"
  54.                      "items":{  
  55.                         "$ref":"#/definitions/Pet" 
  56.                      } 
  57.                   } 
  58.                }, 
  59. ... 

讓我們考慮一下這個結果。使用上面的JSON文件,您可以潛在地創建具有完整IntelliSense的C#客戶端。畢竟,您知道所有路徑,操作,它們期望的參數,什么參數類型,什么是響應等等。

有幾種工具可以做到這一點。對于服務器端,可以使用Swashbuckle.AspNetCore[4]將Swagger添加到ASP.NET中并生成所述JSON文件。對于客戶端,您可以使用swagger-codegen[5]和AutoRest[6]來使用這些JSON文件并生成客戶端。讓我們看一個如何做到這一點的例子:

將Swagger添加到ASP.NET服務器

首先添加NuGet包Swashbuckle.AspNetCore[7]。在中ConfigureServices,注冊Swagger生成器:

  1. services.AddSwaggerGen(options =>  
  2.     options.SwaggerDoc("v1", new OpenApiInfo {Title = "My Web API", Version = "v1"})); 

在添加Configure方法中Startup.cs:

  1. app.UseSwagger(); 

最后,控制器內部的動作應使用[HttpXXX]和[FromXXX]屬性修飾:

  1. [HttpPost] 
  2. public async Task AddEmployee([FromBody]Employee employee) 
  3.     //... 
  4.  
  5. [HttpGet] 
  6. public async Task<Employee> Employee([FromQuery]string id) 
  7.     //... 

就像服務器端一樣簡單。運行項目時,swagger.json將生成一個文件,可用于生成客戶端。

使用AutoRest從Swagger生成客戶端

要開始使用AutoRest[8],與安裝NPM[9]:npm install -g autorest。安裝后,您將需要使用AutoRest的命令行界面從該swagger.json文件生成C#客戶端。這是一個例子:

  1. autorest --input-file="./swagger.json" --output-folder="GeneratedClient" --namespace="MyClient" --override-client-name="MyClient" --csharp 

這將產生一個GeneratedClient包含生成的C#文件的文件夾。請注意,名稱空間和客戶端名稱被覆蓋。從這里,將此文件夾添加到Visual Studio中的客戶端項目。

您需要安裝Microsoft.Rest.ClientRuntimeNuGet軟件包,因為生成的代碼取決于該軟件包。安裝后,您可以像使用常規C#類一樣使用API:

  1. var client = new MyClient(); 
  2. Employee employee = client.Employee(id: "abc"); 

您可以在AutoRest的文檔中[10]閱讀一些細微之處。而且您需要使該過程自動化,因此我建議閱讀Patrik Svensson的教程,[11]以獲得一些好的建議以及Peter Jausovec的這篇文章[12]。

Swagger的問題是JSON文件是在運行時創建的,因此這使得在CI / CD流程中實現自動化有點困難。

傳統REST vs Swagger vs ReFit

進行選擇時,請注意以下幾點。

  • 如果您有一個非常簡單的私有REST API,則也許不必理會客戶端生成和共享接口。小任務并不能證明付出額外的努力是合理的。
  • Swagger支持多種語言,而ReFit僅支持.NET。Swagger還是許多工具,測試,自動化和UI工具的基礎。如果您要創建一個大型的公共API,它將可能是最佳選擇。
  • Swagger比ReFit復雜得多。使用ReFit,只需在服務器和客戶端項目中添加一個接口即可。另一方面,使用ReFit,您必須為每個控制器創建新的接口,而Swagger會自動進行處理。

但是在決定任何事情之前,請檢查與REST無關的第四個選項。

gRPC

gRPC[13](gRPC遠程過程調用)是Google開發的開源遠程過程調用系統。它有點像REST,它提供了一種將請求從客戶端發送到服務器的方式。但這在許多方面都不同,這是相同點和不同點:

  • 像REST一樣,gRPC與語言無關。有適用于所有流行語言的工具,包括C#。
  • gRPC是契約的基礎,并使用.proto文件來定義契約。這有點類似于Swaggerswagger.json和ReFit的共享界面。可以從那些文件中生成任何編程語言的客戶端。
  • gRPC使用協議緩沖區(Protobuf)[14]二進制序列化。這與REST(通常序列化為JSON或XML)不同。二進制序列化較小,因此更快。
  • gRPC用于使用HTTP / 2協議創建持久連接。該協議更簡單,更緊湊。REST使用HTTP 1.x協議(通常為HTTP 1.1)。
  • HTTP 1.1要求每個請求都進行TCP握手,而HTTP / 2則保持連接打開。
  • HTTP / 2連接使用多路復用流。這意味著單個TCP連接可以支持許多流。這些流可以并行執行,而不必像HTTP 1.1中那樣互相等待。
  • gRPC允許雙向流。

有兩種使用gRPC的方法。對于.NET Core 3.0,有一個完全托管的庫,稱為.NET的gRPC[15]。對于其中的任何內容,您都可以使用gRPC C#[16],它是使用本機代碼構建的。這并不意味著適用于.NET的gRPC可以替代gRPC C#。讓我們來看一個用于.NET的更新gRPC的示例。

.NET的gRPC的服務器端

這不是教程,而是更多有關預期內容的一般性想法。這是示例控制器在gRPC中的外觀:

  1. public class GreeterService : Greeter.GreeterBase 
  2.     public override Task<HelloReply> SayHello(HelloRequest request, 
  3.         ServerCallContext context) 
  4.     { 
  5.         _logger.LogInformation("Saying hello to {Name}", request.Name); 
  6.         return Task.FromResult(new HelloReply  
  7.         { 
  8.             Message = "Hello " + request.Name 
  9.         }); 
  10.     } 

您需要添加以下的Configure在Startup.cs:

  1. app.UseEndpoints(endpoints => 
  2.     endpoints.MapGrpcService<GreeterService>(); 
  3. }); 

API在.proto文件中描述,該文件是項目的一部分:

  1. syntax = "proto3"
  2.  
  3. service Greeter { 
  4.   rpc SayHello (HelloRequest) returns (HelloReply); 
  5.  
  6. message HelloRequest { 
  7.   string name = 1; 
  8.  
  9. message HelloReply { 
  10.   string message = 1; 

此.proto文件添加到.csproj:

  1. <ItemGroup> 
  2.   <Protobuf Include="Protos\greet.proto" /> 
  3. </ItemGroup> 

 

.NET的gRPC客戶端

客戶端是從.proto文件生成的。代碼本身非常簡單:

  1. var channel = GrpcChannel.ForAddress("https://localhost:5001"); 
  2. var client = new Greeter.GreeterClient(channel); 
  3.  
  4. var response = await client.SayHello( 
  5.     new HelloRequest { Name = "World" }); 
  6.  
  7. Console.WriteLine(response.Message); 

gRPC與REST

gRPC聽起來不錯。它在框架下更快,更簡單。那么,我們都應該從REST變為gRPC嗎?答案是,這取決于你的應用場景。

以下是一些注意事項:

從我的印象來看,使用gRPC和ASP.NET仍然不是很好。借助對REST的成熟支持,您會變得更好。就基于契約的通信而言,這很不錯,除了在REST中有我們已經討論過的類似替代方案:Swagger和ReFit。

最大的優勢是性能。根據這些基準[17],在大多數情況下,gRPC更快。特別是對于大型有效載荷,Protobuf序列化確實有所作為。這意味著對于高負載服務器而言,這是一個巨大的優勢。

在大型ASP.NET應用程序中從REST過渡到gRPC將非常困難。但是,如果您具有基于微服務的體系結構,那么逐步完成此過渡就變得容易得多。

其他溝通方式

還有其他一些我完全沒有提及的通信方式,但是值得一提的是:

  • GraphQL[18]是Facebook開發的API的查詢語言。它允許客戶端從服務器確切地要求它需要的數據。這樣,您可以在服務器上僅創建一個端點,該端點將非常靈活,并且僅返回客戶端所需的數據。近年來,GraphQL變得非常流行。
  • SignalR[19]是一項允許服務器與客戶端之間進行實時雙向通信的技術。SignalR不僅允許客戶端始終向服務器發送請求,還允許服務器向客戶端發送推送通知。這樣可以查看Web應用程序中的實時更新。SignalR在ASP.NET中非常流行。
  • TcpClient[20]和TcpListener[21](在中System.Net.Sockets)提供基于TCP的低級連接。基本上,您將建立連接并傳輸字節數組。對于大型應用程序而言,它不是理想的選擇,在大型應用程序中,您可以使用ASP.NET的控制器和操作在大型API中進行訂購。
  • UdpClient[22]提供了一種通過UDP協議進行通信的方法。TCP建立連接,然后發送數據,而UDP僅發送數據。TCP確保數據中沒有錯誤,而UDP沒有。UDP可以更有效地快速傳輸數據,您不必擔心它是否可靠且沒有錯誤。一些示例是:視頻流,實時廣播和IP語音(VoIP)。
  • WCF[23]是一種較舊的技術,主要在進程之間使用基于SOAP的通信。這是一個龐大的框架,我要說的是它已不再受REST和JSON負載的歡迎。

References

[1] POCO類: https://www.c-sharpcorner.com/UploadFile/5d065a/poco-classes-in-entity-framework/

[2] OpenAPI: https://swagger.io/specification/

[3] Swagger Petstore: https://bfanger.nl/swagger-explained/#operationObject

[4] Swashbuckle.AspNetCore: https://github.com/domaindrivendev/Swashbuckle.AspNetCore

[5] swagger-codegen: https://github.com/swagger-api/swagger-codegen

[6] AutoRest: https://azure.github.io/autorest/

[7] Swashbuckle.AspNetCore: https://www.nuget.org/packages/Swashbuckle.AspNetCore

[8] AutoRest: https://github.com/Azure/autorest

[9] NPM: https://www.w3schools.com/nodejs/nodejs_npm.asp

[10] 文檔中: https://azure.github.io/autorest/client/ops.html

[11] 教程,: https://www.patriksvensson.se/2018/10/generating-api-clients-using-autorest

[12] 文章: https://medium.com/@pjausovec/creating-c-client-library-for-web-api-projects-be132c831f9c

[13] gRPC: https://grpc.io/

[14] 協議緩沖區(Protobuf): https://en.wikipedia.org/wiki/Protocol_Buffers

[15] .NET的gRPC: https://github.com/grpc/grpc-dotnet

[16] gRPC C#: https://github.com/grpc/grpc/tree/master/src/csharp

[17] 根據這些基準: https://www.yonego.com/nl/why-milliseconds-matter/#gref

[18] GraphQL: https://graphql.org/

[19] SignalR: https://github.com/SignalR/SignalR

[20] TcpClient: https://docs.microsoft.com/en-us/dotnet/api/system.net.sockets.tcpclient?view=netframework-4.8

[21] TcpListener: https://docs.microsoft.com/en-us/dotnet/api/system.net.sockets.tcplistener?view=netframework-4.8

[22] UdpClient: https://docs.microsoft.com/en-us/dotnet/api/system.net.sockets.udpclient?view=netframework-4.8

 

[23] WCF: https://docs.microsoft.com/en-us/dotnet/framework/wcf/whats-wcf

 

責任編輯:武曉燕 來源: DotNET技術圈
相關推薦

2009-08-21 15:59:22

服務端與客戶端通信

2009-08-21 16:14:52

服務端與客戶端通信

2010-03-19 09:26:34

Java Socket

2009-08-21 15:54:40

服務端與客戶端

2009-08-21 15:36:41

服務端與客戶端

2022-06-14 15:07:04

IPC客戶端服務端

2021-10-14 08:39:17

Java Netty Java 基礎

2018-12-20 08:50:53

TCPIP服務器

2010-11-19 14:22:04

oracle服務端

2010-03-18 17:47:07

Java 多客戶端通信

2010-03-01 16:10:32

Linux Samba

2010-01-11 13:05:24

VNC server配

2023-03-06 08:01:56

MySQLCtrl + C

2012-05-07 13:55:41

JavaJava Web

2022-02-20 23:15:46

gRPCGolang語言

2024-04-07 00:00:01

TypeScript語言REST

2021-09-22 15:46:29

虛擬桌面瘦客戶端胖客戶端

2011-09-09 09:44:23

WCF

2018-04-12 10:55:41

Android服務器數據

2011-03-28 17:24:26

點贊
收藏

51CTO技術棧公眾號

亚洲www永久成人夜色| 亚洲男子天堂网| 国产精品三级一区二区| 天天干天天干天天干| 亚洲欧美日韩一区在线观看| 最近2019中文免费高清视频观看www99| 在线看免费毛片| 97超碰在线免费| 中文天堂在线一区| 国产精品精品软件视频| 国产99免费视频| 自拍偷拍欧美| 日韩国产在线观看| 亚洲欧洲第一视频| 日本一二三区在线| 亚洲精品mv| 亚洲精品一二三四区| 老牛影视免费一区二区| 99在线精品视频免费观看20| 玖玖视频精品| 欧美激情国产高清| 欧美色视频一区二区三区在线观看| eeuss鲁片一区二区三区| 精品视频999| 99爱视频在线| 欧美videosex性欧美黑吊| 国产日韩欧美激情| 精品无人区一区二区三区竹菊| 亚洲视频在线观看一区二区| 久久蜜桃精品| 97精品国产aⅴ7777| 亚洲最大的黄色网址| 国产乱码精品一区二区亚洲| 亚洲成人在线网| 日韩久久久久久久久久久| 成人国产精品入口免费视频| 欧美日韩中文字幕在线| 妺妺窝人体色777777| gogo在线观看| 亚洲日本va午夜在线影院| 手机看片福利永久国产日韩| 丰满人妻一区二区| 国产不卡在线一区| 亚洲自拍偷拍视频| 国产欧美日韩综合精品一区二区三区| 美女脱光内衣内裤视频久久影院| 日本乱人伦a精品| 国产精品男女视频| 亚洲麻豆一区| 91高清视频在线免费观看| 国产香蕉在线视频| 一区二区激情| 7m第一福利500精品视频| 日韩欧美三级在线观看| 一区在线视频观看| 韩剧1988免费观看全集| 亚洲一区欧美在线| 国产亚洲毛片在线| 亲爱的老师9免费观看全集电视剧| 日本一级一片免费视频| 西西裸体人体做爰大胆久久久| 欧美与黑人午夜性猛交久久久| 欧美三级一区二区三区| 久久男女视频| 国产精品久久久久久久久| 一级aaaa毛片| 国产精品99久久不卡二区| 91久久国产自产拍夜夜嗨| www久久久com| 99国产精品一区| 日本一区二区三区四区在线观看| 成人在线高清视频| 亚洲精品第1页| 97超碰在线人人| 东京一区二区| 欧美日韩精品福利| 一二三区视频在线观看| 天天久久夜夜| 日韩在线视频网站| 久久艹精品视频| 国产亚洲欧洲| 成人在线激情视频| 手机看片国产1024| 国产欧美日韩久久| 五月天激情图片| 天堂√8在线中文| 欧美日韩一区二区在线观看 | 日韩欧美在线网站| 精品一区二区三区四区五区六区| 亚洲精品亚洲人成在线观看| 中文字幕国产亚洲| 久久成人国产精品入口| 日韩专区一卡二卡| av成人综合网| 成人午夜影视| 亚洲一卡二卡三卡四卡无卡久久 | 久久av偷拍| 亚洲韩国青草视频| 亚洲激情图片网| 在线观看不卡| 成人福利视频网| 人成在线免费视频| 亚洲综合无码一区二区| 黄色一级大片在线观看| 亚洲福利合集| 在线观看成人黄色| 欧美一二三区视频| 国产在线不卡一区| 午夜精品一区二区三区四区 | 国产成人精品优优av| 精品人妻少妇嫩草av无码专区 | 强乱中文字幕av一区乱码| 香蕉国产精品偷在线观看不卡| 91精品国产综合久久久久久蜜臀| 三级毛片在线免费看| 亚洲精品免费视频| 美女在线视频一区二区 | 中文字幕免费高| 中文在线8资源库| 欧美r级电影在线观看| 中文字幕av久久爽一区| 亚洲精选91| 97se在线视频| jizz性欧美| 欧美精选在线播放| 99精品全国免费观看| 免费一区视频| 国内一区在线| 变态调教一区二区三区| 欧美一区二区精品在线| 国产精品1区2区3区4区| 日欧美一区二区| 欧美国产综合视频| sis001欧美| 亚洲免费中文字幕| 亚洲 欧美 日韩 综合| 国产成人精品亚洲日本在线桃色| 中文字幕av导航| 欧美91在线|欧美| 爽爽爽爽爽爽爽成人免费观看| 午夜婷婷在线观看| 成人动漫在线一区| 很污的网站在线观看| 嗯用力啊快一点好舒服小柔久久| 欧美日韩aaaa| 性一交一乱一色一视频麻豆| 一区二区三区精品视频在线| 国产乱国产乱老熟300部视频| 欧美.www| 国产九色精品| 日韩电影免费看| 亚洲片av在线| 中文字字幕在线中文乱码| 亚洲国产高清在线观看视频| 欧美伦理片在线观看| 久久视频精品| 亚洲最大激情中文字幕| 丁香花高清在线观看完整版| 亚洲第一福利网| 少妇一级淫片免费放中国| 91啪九色porn原创视频在线观看| 超碰影院在线观看| 日韩精品中文字幕第1页| 成人久久久久久| 国产www视频在线观看| 亚洲国产欧美一区| 国产午夜麻豆影院在线观看| 中文字幕中文字幕在线一区| 亚洲自拍第三页| 今天的高清视频免费播放成人| 麻豆成人av| 日韩福利在线观看| 久久久久久国产精品| 手机亚洲第一页| 欧美视频一区二区| 青娱乐国产盛宴| 91在线观看一区二区| 国产精品无码一本二本三本色| 日韩精品欧美| 国产激情美女久久久久久吹潮| 综合日韩av| 精品激情国产视频| 欧美性猛交 xxxx| 欧美又粗又大又爽| 久久久.www| 日本一区二区三区在线观看| 佐山爱在线视频| 欧美亚洲自偷自偷| 法国空姐在线观看免费| 日韩精品丝袜美腿| 亚洲精品欧美日韩专区| 电影一区二区三区| 欧美大片在线免费观看| 国产一区电影| 精品久久99ma| 一级特黄aa大片| 精品久久中文字幕| 人妻人人澡人人添人人爽| 久久一留热品黄| 欧美体内she精高潮| 日本女优在线视频一区二区| 蜜臀av色欲a片无码精品一区| 青草国产精品| 欧美激情视频一区二区三区| 欧美黄色一级| 国产精品免费一区| 日韩深夜视频| 欧美精品久久久久久久久久| 91激情在线| 亚洲欧美综合精品久久成人| 亚洲第一色网站| 欧美日韩三级视频| 天天操夜夜操视频| 樱花草国产18久久久久| 九一在线免费观看| 久久男人中文字幕资源站| 亚洲成人激情小说| 精品亚洲成av人在线观看| 欧美日韩一区二区在线免费观看| 欧美网站在线| 国产欧美综合一区| 91久久夜色精品国产按摩| 日本一区二区三不卡| 欧美三级电影在线| 国产精品一区二区av| 蜜桃在线一区| 91九色单男在线观看| 未满十八勿进黄网站一区不卡| 日韩免费观看av| 蜜桃在线视频| 91精品国产91久久久久久久久| 国产网红在线观看| 欧美乱妇高清无乱码| 91cn在线观看| 不卡av电影在线观看| 日本欧美在线视频免费观看| 少妇高潮久久久久久潘金莲| 国产女主播在线写真| 亚洲欧美国产制服动漫| 欧美日韩在线精品一区二区三区激情综 | 亚洲一区二区三区在线免费| 亚洲www在线| 精品国产亚洲一区二区三区大结局| 成人久久久久久久| 精品久久国产一区| 2019国产精品视频| 亚洲一级大片| 国产原创精品| 日韩中文av| 欧美日韩最好看的视频| 深爱激情久久| 亚洲欧洲精品在线观看| **女人18毛片一区二区| 男女爱爱视频网站| 欧美涩涩网站| 国内外成人激情视频| 视频一区欧美日韩| 特黄视频免费观看| 国产精品99久久久久久久女警| 国产高潮失禁喷水爽到抽搐| 99久久精品情趣| 亚洲av无码一区二区三区人 | 亚洲午夜激情| 亚洲国产精品日韩专区av有中文| 黄色影视在线观看| 亚洲二区精品| 男女无套免费视频网站动漫| 久久国产精品99久久久久久老狼| 日本特黄在线观看| 波多野结衣精品在线| 日本xxxxxxxxx18| 亚洲日本一区二区| 国产微拍精品一区| 欧美日韩亚洲不卡| 亚洲精品久久久狠狠狠爱| 亚洲精品天天看| 香蕉视频免费在线播放| 欧美尺度大的性做爰视频| 老色鬼在线视频| 国产精品久久久久久久久久99 | 中文av在线全新| 国产精品视频免费在线观看| 色妞ww精品视频7777| 久久久久久国产精品免费免费| 色狮一区二区三区四区视频| 国产 欧美 日韩 一区| 久久国产高清| 日本中文字幕在线不卡| 2017欧美狠狠色| 国产成人久久久久| 懂色av一区二区三区| 国产又大又粗又硬| 日韩不卡中文字幕| 黄色小网站在线观看| 欧美在线欧美在线| 国产精品视频一区视频二区| 欧美激情视频一区二区三区| 女人天堂亚洲aⅴ在线观看| 国产裸体舞一区二区三区| 国产精品伊人色| 久久午夜精品视频| 欧美日韩国产一中文字不卡| 国产女人18毛片18精品| 国产一区二区三区在线看| 在线中文字幕-区二区三区四区| 国产精品18久久久久久麻辣| 97久久综合区小说区图片区 | 黄色视屏免费在线观看| 欧洲亚洲免费在线| 中文在线免费一区三区| 在线观看成人av电影| 久久九九精品| 亚洲啪av永久无码精品放毛片| 亚洲欧美综合在线精品| www.色国产| 日韩av在线免费| 日本不卡影院| 亚洲va电影大全| 欧美激情另类| 色婷婷.com| 国产精品污网站| 尤物视频免费观看| 日韩精品在线视频美女| 成人爽a毛片免费啪啪动漫| 成人免费在线视频网站| 日韩国产一区二区三区| 日韩无套无码精品| 久久久三级国产网站| 亚洲免费在线观看av| 亚洲精品第一页| www视频在线观看| 狠狠综合久久av| 日韩视频一区| 粉嫩av懂色av蜜臀av分享| 亚洲v中文字幕| 人人妻人人澡人人爽久久av| 欧美丰满少妇xxxx| 欧洲大片精品免费永久看nba| 日韩人妻一区二区三区蜜桃视频| 国产做a爰片久久毛片| 国产美女久久久久久| 91精品国产乱| 欧美精品videosex| 国产精品二区三区| 亚洲免费播放| 在线观看av中文字幕| 欧美性猛交xxxx乱大交| 国产在线电影| 国产又爽又黄的激情精品视频| 国产精品毛片久久| 亚洲一级片免费观看| 亚洲综合网站在线观看| 婷婷五月综合久久中文字幕| 欧美一级电影久久| 国产精品最新| 亚洲精品在线视频播放| 一区二区在线观看视频| 日本精品999| 国产精品91久久久| 911精品美国片911久久久| 韩国三级hd中文字幕有哪些| 亚洲国产精品久久久男人的天堂| 日韩一级中文字幕| 国产精品久久久久久久久久99| 天天综合网网欲色| 国内精品免费视频| 欧美性色视频在线| 日本欧美在线视频免费观看| 成人看片在线| 久久精品毛片| 91精品少妇一区二区三区蜜桃臀| 欧美一卡在线观看| 亚洲一级少妇| 中文有码久久| 成人av先锋影音| 中文字幕理论片| 欧美高清视频在线播放| 九一成人免费视频| 亚洲第一成肉网| 日韩欧美精品中文字幕| 黄网站在线免费看| 精品在线视频一区二区三区| 蜜臀av国产精品久久久久| 欧美黄色一区二区三区| 亚洲免费一在线| 亚洲精品一区二区三区在线| 亚洲成熟丰满熟妇高潮xxxxx| 亚洲日本欧美天堂| 国产日韩精品在线看| 亚洲在线免费观看| 日韩高清国产一区在线| 国产亚洲欧美久久久久| 在线播放日韩欧美| 国产另类在线| 天堂av手机在线| 日韩欧美国产一区二区| 色帝国亚洲欧美在线| 亚洲不卡一卡2卡三卡4卡5卡精品| 激情伊人五月天久久综合| 在线永久看片免费的视频|