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

首頁 > 學院 > 開發設計 > 正文

在Web Service中使用ASP.net狀態保持

2019-11-17 04:10:17
字體:
來源:轉載
供稿:網友

     簡介
 ?。牐犛性S多聰明的辦法可以解決HTTP協議的無狀態問題,例如對每個請求重復發送應用程序數據包、使用HTTP認證機制來將請求映射到特定的用戶、使用Cookie來存儲一系列請求的狀態等。在asp.net技術中提供了一個非常有效的方案來保持狀態,該方案隱藏了所有高難度的,具有挑戰性的工作的細節,用戶只需簡單地使用System.Web.sessionState.HttpSessionState類。同時,你也可以像在ASP.net程序地Web頁面(.aspx)中一樣在Web Service的方法中使用這個類,只有一點小小的不同。


  ASP.net的Session對象概述
 ?。牐燗SP.net的Session狀態信息在根本上通過兩個機制保持。其一是使用Cookie。當客戶端發送一個請求到服務器端時,服務器將發回一個附加HTTP Set-Cookie頭的響應信息,而Cookie的值就是以鍵/值對的形式保存在該信息里邊。在對同一服務器的所有的同步請求中,客戶端在HTTP Cookie頭中發送Cookie鍵/值對。然后服務器可以將并發的請求同初始的請求對應起來。ASP.net使用一個保存會話的ID的cookie來保持會話狀態。該ID標識被用來為特定的用戶找到與其對應的HttpSessionState類的實例。類HttpSessionState僅僅提供了一個通用的數據集,你可以在其中保存你需要的任何信息。
 ?。牐燗SP.net用來保持狀態的另外一個機制工作時無須使用Cookie。一些瀏覽器被用戶設置為禁止使用cookie或者干脆就不支持Cookie,ASP.net提供了一種機制來解決這個問題,它的主要原理是將一個請求重定向到一個包含ASP.net狀態ID的URL。當該請求被接受到時,這個嵌在URL中的ID被截取下來,服務器通過該ID找到合適的HttpSessionState類的實例。這種方式在HTTP協議的使用GET方式的請求中工作的很好,但是在.net的xml Web Service代碼中會出現問題。
 ?。牐牨仨氈赋龅氖牵行r候把信息直接存儲在Cookie中要比存儲在Session中更好。避免使用Session可以節省服務器資源,而且你也無須考慮一些煩人的問題,比如定位一個特定的Session對象、Session對象因為請求的長時間的延遲而被移除或者在服務器上沒必要地保留直到過期。然而,如果你有一些包含你不希望與你提供的服務的使用者共享的執行信息,或者有一些你不希望通過未加密的信道傳輸的私有數據,或者你認為將這些數據插入HTTP協議頭中是不切實際的,那么你就應該使用ASP.net中的HttpSessionState,它將使你輕松解決這些問題。HttpSessionState類返回一個索引鍵,用以將一個特定的用戶映射到一個為該用戶保存信息的HttpSessionState類的實例??傊?,無論是ASP.net的HttpSessionState類還是HTTP的Cookie都可以在ASP.net Web Service中使用。


  在XML Web Service中使用基于HTTP的機制來實現狀態保持的理由
 ?。牐犜赟OAP請求中有許多方法來保持狀態。一個切實可行的方法就是在SOAP頭中包含一些像ASP中的會話ID的信息,然而問題在于你不得不:
  1) 仍然要自己編寫服務器端代碼。
  2) 確信你的客戶會像對待HTTP Cookie一樣對待你的包含會話ID的SOAP頭并且將它附加到每個請求中回傳給你。
 ?。牐牣斎挥泻芏鄷r候使用SOAP頭的方法會很方便,但是也有很多時候還不如使用基于HTTP協議的方法。
  很容易在ASP.net中使用Session來保持狀態信息,HttpSessionState類為你封裝了存儲Session狀態的細節問題。絕大多數的客戶端已經能夠明白他們必須返回服務器設置的cookie,而且HttpSessionState類也支持在SOAP通信中常用的底層傳輸。(問題)因此,很明顯,使用ASP.net的Session機制會是滿足狀態控制要求的明智的選擇。


  使服務器支持Session
 ?。牐犜贏SP.net中,對Web方法的狀態支持默認是關閉的,你必須為每個要使用Session狀態的Web方法顯式地激活Session支持。激活Session支持的方法是添加一個EnableSession選項到你的函數的WebMethod屬性中,并且將其值設置為true。下面的代碼演示了如何激活Session并且在方法中訪問Session狀態信息。
  [VB.net]
  _
  Public Function IncrementSessionCounterX() As Integer
  Dim counter As Integer
  If Context.Session("Counter") Is Nothing Then
  counter = 1
  Else
  counter = Context.Session("Counter") + 1
  End If
  Context.Session("Counter") = counter
  Return counter
  End Function
 ?。牐犎缒闼?,如果你為一個Web方法激活了Session支持,并不意味著其它的Web方法的Session支持也被激活。事實上,如果Web方法的EnableSession選項沒有被顯式地設置為true,那么Context.Session屬性的值將是null。
 ?。牐牸僭O通過設置web.config文件禁止session,那么即使你在WebMethod屬性中使用了EnableSession選項,Context.Session的值也將一直是null。web.config文件中的/configuration/system.web/sessionState項有一個mode參數,它決定了你的ASP.net程序使用何種方法來保持Session狀態。該參數默認設置為“InPRoc”,這時HttpSessionState對象將簡單地保存在ASP.net進程的內存區。如果被設置為“Off”,那么ASP.net程序的Session支持就被關閉了。
 ?。牐爮姆掌鞫丝磥?,ASP.net的session狀態的有效范圍僅僅是某一個給定的ASP.net應用程序,這就意味著一個HttpSessionState類的實例只能被一個特定用戶向某一個虛擬目錄發出的所有Session被激活的ASP.net請求所使用,也就是說,使用同一個會話ID的向其它的虛擬目錄的請求將導致ASP.net不能找到對應的session對象——因為會話ID不是為該ASP.net應用程序設定的。ASP.net并不區分對ASPX和ASMX文件的請求,直到該請求需要使用Session對象,因此,理論上你可以在一個Web方法調用和一個普通的ASPX文件之間共享Session狀態信息。然而,我們將看到也有些客戶端的問題使這個想法變得不那么容易
       當設置一個HTTP cookie,你可以指定其過期時間。過期時間指定在多久的時間內,客戶端應該將該cookie回傳給服務器。如果一個cookie沒有被設置過期時間,那么它僅僅在該進程處理請求的時間內被回傳。例如,IE將一直回傳cookie,除非你關閉了瀏覽器的特定窗口。ASP.net的用來保存會話ID的Cookie沒有過期時間,因此,如果一臺客戶機上的多個進程向你的服務器上發送HTTP請求,它們也不會共享同一個HttpSessionState對象,甚至兩個進程同時運行也是這樣。
 ?。牐犎绻阋幚韥碜酝粋€進程的并發的Web Service調用,那么這些請求將在服務器上被排序,從而使得在某一時刻只有一個請求被執行。ASP.net的Web Service不像普通.ASPX頁面,支持允許多請求的并發進程的對HttpSessionState對象的只讀訪問,所有Session被激活的Web方法調用都具有read/write訪問的權限,因此必須對之進行排序。


  客戶端的問題
 ?。牐犜谀愕腤ebService中成功的使用HttpSessionState的功能事實上依賴于對用戶的一些假設。首先,也是最重要的一點,如果你是用默認的HTTP Cookie模式來保存Session狀態,你的客戶端就必須支持cookie;如果你是用無cookie的機制來支持Session,那么你的客戶端必須能夠并且愿意重定向到一個新的URL,該URL由原來的URL中插入會話ID而得到。結果將表明,這并不是一個無足輕重的問題,它關系到你能否成功地部署你的程序。


  所有工作都依賴于瀏覽器
 ?。牐犎绻闶怯肕icrosoft Visual Studio.net來開發ASP.net Web Service應用程序,那么默認的調試方法就是打開IE訪問你的.asmx文件。通常,系統將提供一個可以調用你的Web方法的友好的界面,這是一個調試你的Web Service代碼的很好的途徑。如果你已經將Web方法的EnableSession選項設置為true,它被非常漂亮地支持,甚至如果你打開了無cookie的Session支持,客戶端瀏覽器也可以完美地完成這項工作,你的Session對象將如你所愿地工作。
 ?。牐犎欢蠖鄶档腤eb Service請求不是來自瀏覽器,而是來自應用程序中的Web引用。我們如何使用.net框架的“添加Web引用”的特性呢?讓我們來看一看。


  添加Web引用的問題
 ?。牐犖覍⑹褂梦覀兦懊婵吹降拇a段來創建一個簡單的XML Web Service。記起來了吧?這個Web方法被稱作IncrementSessionCounter,它僅僅是簡單地把一個整數存儲在HttpSessionState對象中,然后每次調用則將它加1,并且返回當前值。從客戶端瀏覽器我們可以看到這個數字的值隨著調用次數的增加而增加。
        下一步,我創建了一個簡單的WinForm應用程序,并且將上述的Web Service添加到Web引用中。下面就是調用我的Web Service的代碼:
  ' 這里并沒有與Session打交道
  Private Sub Button1_Click(ByVal sender As System.Object, _
  ByVal e As System.EventArgs) Handles Button1.Click
  Dim proxy As New localhost.Service1()
  Dim ret As Integer
  ret = proxy.IncrementSessionCounter()
  Label1.Text = "Result: " & CStr(ret)
  End Sub
 ?。牐牣斘业谝淮握{用Web Service時,一切正常,Web方法返回1,這就是那個Session變量的應有的初始值?,F在我點擊Button1來再次調用這個Web方法,我希望看到的返回值是2??上У氖?,無論我點擊多少次Button1,返回值一直都是1。
 ?。牐犇阋苍S會懷疑原因就是我每次都創建了一個新的proxy類的實例去調用Web方法,因此每次我點擊按鈕,都會丟失上一次調用時的cookie。不幸的是,即使你將proxy類的初始化代碼移到窗體的構造函數中,然后對每次Web方法調用使用同一個proxy類的實例,你還是不可能看到返回值有增加的跡象。
 ?。牐爢栴}在于cookie。Web Service代碼并未從調用請求中發現有效的會話ID,因此它每次被調用都創建一個全新的HttpSessionState對象,并且返回它的初始值1。因為作為客戶端的proxy類是從類System.Web.Service.Protocols.SoapHttpClientProtocol繼承的,它不包含System.Net.CookieContainer類的實例,因此,沒有地方來存放返回的cookie。為了解決這個問題,我對代碼做了如下一些修改:
  ' 使用了ASP.NET的session
  ' 但是并不是無Cookie的session.
  Private Cookies As System.Net.CookieContainer
  Private Sub Button1_Click(ByVal sender As System.Object, _
  ByVal e As System.EventArgs) Handles Button1.Click
  Dim proxy As New localhost.Service1()
  Dim ret As Integer
  ' 為proxy類設置cookie容器
  If Cookies Is Nothing Then
  Cookies = New System.Net.CookieContainer()
  End If
  proxy.CookieContainer = Cookies
  ret = proxy.IncrementSessionCounter()
  Label1.Text = "Result: " & CStr(ret)
  End Sub
  現在代碼工作正常了!每點擊一次Button1,我都可以看到返回值增加1。注意到我并不是在函數中聲明變量Cookies的,它是窗體類的一個私有成員,因為如果希望每次都返回同一個會話ID給服務器的話,就必須在每次請求中使用CookieContainer類的同一個實例。這就解釋了為什么SoapHttpClientProtocol類默認不自動地設置的cookie容器。正應為此,你可以在多個SoapHttpClientProtocol類的實例中共享一個cookie容器,而不是為其每個實例自動地創建一個新的cookie容器。


  無cookie的Session
 ?。牐爮腤eb Service的開發者的角度來看,你可以想到相當多的人在試圖使用你的Web服務時忘記在客戶端代理類中添加Cookie容器。聰明的開發者或許靈光一閃,就會發現無cookie的Session應該可以出色地解決這個問題。如果將web.config文件中sessionState元素的cookieless參數設置為“true”,你將會發現,通過瀏覽器界面調用Web方法時,session變量工作正常,但是如果你在Visual Studio.net中通過“添加Web引用”來調用它時,依然存在著一些問題。
        為了研究無cookie的session,我決定使用上面已經使用過的代碼,看看它能否在session狀態被設置為cookieless的服務器環境中能否工作正常。我也不想費心去刪除cookie容器的相關代碼,因為我希望得到能在兩種session狀態下都正常工作的代碼。作為一個天生的樂觀主義者,我一個字也不改就直接運行它。令人失望的事發生了——不過也不是完全沒有想到,我不得不面對這個異常:
  An unhandled exception of type 'System.Net.WebException' occurred in system.web.services.dll
  Additional information: The request failed with the error message:
  --
  Object moved to here.
  
 ?。牐牥l生了什么呢?原來HTTP請求收到的不是“200 OK”響應。如果你熟悉HTTP協議,你或許可以從響應中的HTML代碼中發現這是一個“302 Found”響應,這意味著該請求被重定向到超鏈接中指定的地址。返回HTML代碼是很明智的,這樣如果一個瀏覽器因為某些原因不支持重定向的話,它可以把代碼顯示出來,或者在重定向過程中顯示這些代碼直到重定向完成。注意到超鏈接中包含了一個有趣的字符串“(l2z3psnhh2cf1oahmai44p21)”,顯然,我們可以推斷這就是ASP.net的會話ID,它被嵌入了我們要重定向到的位置的URL中。在客戶端代理中,我們需要做的僅僅是重新發送請求到這個新的URL。
 ?。牐牊o須再在Win32 WinInet API編程中跋涉,我們可以直接找到proxy類的一個屬性允許自動重定向。用外行人的說法,就是如果我們接收到一個“302 Found”響應,就直接將請求重新發送到相應中HTTP位置頭所指示的URL。當Visual Studio.net的智能提示顯示proxy類的AllowAutoRedirect屬性時,我感到這東西真是機靈得可愛。我馬上就在代碼中加上如下一行:
  proxy.AllowAutoRedirect = True
 ?。牐犖艺J為這仍然比創建一個CookieContainer類并關聯到proxy類要容易得多,于是我又一次運行程序。很不幸,我遭遇了如下異常(為了簡潔起見有所刪節):
  An unhandled exception of type 'System.InvalidOperationException' occurred
  in system.web.services.dll
  Additional information: Client found response content type of 'text/html; charset=utf-8',
  but expected 'text/xml'.
  The request failed with the error message: …
 ?。牐犎绻憧吹藉e誤消息的內容,你會發現你所看到的HTML頁面跟你瀏覽.ASMX文件的頁面一樣。問題是,為什么當我傳送XML(以SOAP封裝了的形式)到Web Service服務器時它返回的卻是HTML代碼?結果證實,你并沒有在SOAP封裝中發送HTTP POST請求,而僅僅發送了一個簡單的沒有內容的HTTP GET請求,因此你的Web Service服務端理所當然地假設這個請求來自瀏覽器,于是它返回普通的HTML響應。為什么會這樣呢?
 ?。牐犎绻懔私釮TTP協議,你會發現一個HTTP客戶端在收到“302 Found”響應時發送HTTP GET請求到響應中指定的地址是合情合理的,即使初始請求是HTTP POST。這種方式下瀏覽器工作得很好,因為開始幾乎所有的請求都是HTTP GET類型的,只有當你試圖傳遞數據到一個URL時,才會出現上述失敗的結果。
 ?。牐犂碛墒窃趥魉偷臄祿锌赡馨瑵撛诘拿舾袛祿?,因此你需要確認是否用戶真的想向新的資源傳送數據。顯然如果你轉向基于重定向設置的新地址,你就沒能確認用戶是否真的允許將他們的數據發送到新的地址。因此數據并沒有被發送,而代之以簡單的HTTP GET請求。
        我對代碼做了如下修改,捕獲“302 Found”異常,提示用戶同意重定向他們的請求,然后再次在新的位置調用我的Web方法。
  ' 同時使用基于Cookie和Cookie的Session
  Private Cookies As System.Net.CookieContainer
  Private webServiceUrl as Uri
  Private Sub Button1_Click(ByVal sender As System.Object, _
  ByVal e As System.EventArgs) Handles Button1.Click
  Dim proxy As New localhost.Service1()
  Dim ret As Integer
  ' 設置proxy類的Cookie容器
  If Cookies Is Nothing Then
  Cookies = New System.Net.CookieContainer()
  End If
  proxy.CookieContainer = Cookies
  ' 設置proxy類的URL
  If webServiceUrl Is Nothing Then
  webServiceUrl = New Uri(proxy.Url)
  Else
  proxy.Url = webServiceUrl.AbsoluteUri
  End If
  Try
  ret = proxy.IncrementSessionCounter()
  Catch we As WebException
  ' 如果我們想檢測HTTP狀態碼
  ' 那么就需要一個HttpWebResponse類的實例
  If TypeOf we.Response Is HttpWebResponse Then
  Dim HttpResponse As HttpWebResponse
  HttpResponse = we.Response
  If HttpResponse.StatusCode = HttpStatusCode.Found Then
  ' 這是一個“302 Found”響應,提示用戶是否進行重定向
  If MsgBox(String.Format(redirectPrompt, _
  HttpResponse.Headers("Location")), _
  MsgBoxStyle.YesNo) = _
  MsgBoxResult.Yes Then
  ' 用戶選擇Yes,重新嘗試新的URL
  webServiceUrl = New Uri(webServiceUrl, _
  HttpResponse.Headers("Location"))
  Button1_Click(sender, e)
  Return
  End If
  End If
  End If
  Throw we
  End Try
  Label1.Text = "Result: " & CStr(ret)
  End Sub
 ?。牐牞F在ASP.net的Session工作正常了。在你的應用程序中,你可以根據情況自行決定是否提示用戶重定向HTTP POST請求。舉一個例子,如果你正在調用一個Web Service,你也許就不希望出現任何可見的對話框。
  這樣看來,要使ASP.net的Session完全正常地工作還真不是很容易。但是,應該意識到上面的代碼所展示的原理在其他情況下一樣的有用。例如,任何平臺上的任何Web Service,只要它使用HTTP cookie,都需要一個cookie容器,類似地,也許有很多其他的原因導致當你向一個Web Service服務器發送請求時收到“302 Found”響應。在一個復雜的應用程序中調用Web Service時,可能有許多特殊的情形需要你去處理,cookie和重定向的問題就是兩種這樣的情形,你應該將之作為你的Web Service調用代碼中最基本的部分。


  結 論
  在你調用Web方法的過程中,ASP.net對狀態保持是非常有用的,你必須意識到,當你使用手邊的瀏覽器界面測試你的Web Service時,你并沒有面對客戶端程序必須處理的問題。幸運的是,這些問題并不是很難解決。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
伦理中文字幕亚洲| 精品女同一区二区三区在线播放| 亚洲黄色av女优在线观看| 国产精品入口免费视频一| 久久大大胆人体| 国产精品久久久久久网站| 81精品国产乱码久久久久久| 日韩av男人的天堂| 精品国产一区二区三区久久| 狠狠色狠狠色综合日日小说| 久久久久在线观看| 欧美人与物videos| 最近2019年中文视频免费在线观看| 欧美激情视频网站| 国产精品毛片a∨一区二区三区|国| 日韩欧美亚洲一二三区| 中文字幕日韩在线观看| 欧美超级免费视 在线| 国产美女主播一区| 91亚洲午夜在线| 国产免费成人av| 欧美日产国产成人免费图片| 亚洲色图av在线| 亚洲aⅴ日韩av电影在线观看| 久久精品久久久久久| 国产精品午夜一区二区欲梦| 91美女福利视频高清| 欧美亚洲国产精品| 久久精品亚洲热| 在线日韩第一页| 日韩性生活视频| 亚洲国产欧美一区二区三区久久| 精品人伦一区二区三区蜜桃免费| 91av在线免费观看| 国产精品视频免费在线| 欧美激情亚洲一区| 日韩电影中文 亚洲精品乱码| 最近日韩中文字幕中文| xx视频.9999.com| 国产精品成av人在线视午夜片| 欧美多人乱p欧美4p久久| 亚洲精品国产综合区久久久久久久| 米奇精品一区二区三区在线观看| 国产精品va在线播放我和闺蜜| 国产精品大陆在线观看| 亚洲精品999| 日韩精品免费综合视频在线播放| 国产精品久久视频| 欧美自拍视频在线| 国产精品美女免费| 亚洲精品不卡在线| 国产噜噜噜噜久久久久久久久| 国产精品91免费在线| 国产精品99久久久久久久久| 日韩在线视频线视频免费网站| 黑人与娇小精品av专区| 国产精品一区二区电影| 亚洲欧美日韩高清| 91av在线视频观看| 国产日韩在线精品av| 国产精品免费看久久久香蕉| 亚洲欧美综合区自拍另类| 国产日韩在线看| 国产日韩综合一区二区性色av| 欧美性资源免费| 欧美大片va欧美在线播放| 91精品国产自产在线观看永久| 亚洲免费电影在线观看| 91国自产精品中文字幕亚洲| 91精品国产91久久久久福利| 国产女人18毛片水18精品| 精品国产一区二区三区久久久| 亚洲www在线| 久久久久久久久久久免费| 91九色国产在线| 日韩成人网免费视频| 精品成人久久av| 国内精品伊人久久| 一区二区三区视频观看| 欧美性猛交xxxx免费看| 91精品在线观看视频| 国产亚洲a∨片在线观看| 久久这里有精品| 午夜精品理论片| 国产剧情久久久久久| 国产精品香蕉在线观看| 九九九热精品免费视频观看网站| 久久国产精品免费视频| 中文日韩在线观看| 国产一区二区丝袜高跟鞋图片| 欧美大学生性色视频| 国产男人精品视频| 综合久久五月天| 91干在线观看| 午夜精品福利电影| 久久影视电视剧免费网站清宫辞电视| 97在线视频免费看| 国产日韩欧美日韩大片| 久久99精品视频一区97| 91精品国产91久久久久久| 成人av在线网址| 久久视频国产精品免费视频在线| 色偷偷888欧美精品久久久| 日韩国产在线播放| 91精品在线播放| 欧美视频在线免费看| 色噜噜亚洲精品中文字幕| 视频一区视频二区国产精品| 日韩小视频在线| 日韩欧美国产成人| 日韩av第一页| 色妞色视频一区二区三区四区| 日韩亚洲在线观看| 国产不卡一区二区在线播放| 国产91在线播放精品91| 91久久国产精品| 日本一区二区在线播放| 欧美综合一区第一页| 国产成+人+综合+亚洲欧美丁香花| 日韩小视频网址| 国产精品久久久久久久久粉嫩av| 久久男人的天堂| 夜夜嗨av色综合久久久综合网| 久久久电影免费观看完整版| 亚洲欧美激情另类校园| 日韩精品免费在线观看| 欧美成人激情视频| 26uuu亚洲伊人春色| 亚洲精品www| 欧美综合国产精品久久丁香| www.午夜精品| 狠狠躁夜夜躁久久躁别揉| 久久99久久99精品免观看粉嫩| 午夜精品一区二区三区在线视| 国产综合在线观看视频| 国产精品久久婷婷六月丁香| 亚洲精品狠狠操| 国内伊人久久久久久网站视频| 国内精品在线一区| 国产精品69av| 久久成人综合视频| 日韩精品丝袜在线| 国产美女主播一区| 啊v视频在线一区二区三区| 亚洲天堂精品在线| 日韩成人xxxx| 亚洲人成网7777777国产| 97视频在线观看免费| 茄子视频成人在线| 大胆人体色综合| 欧美激情a∨在线视频播放| 欧美电影免费观看高清| 黑人巨大精品欧美一区二区三区| 日韩中文字幕免费视频| 日韩欧美在线视频日韩欧美在线视频| 午夜精品视频网站| 亚洲国产精品视频在线观看| 欧美日韩精品在线| 欧美超级免费视 在线| 欧美亚洲国产精品| 欧美成人免费va影院高清| 国产一区二区欧美日韩| 亚洲视频一区二区| 国产精品亚洲综合天堂夜夜|