欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費電子書(shū)等14項超值服

開(kāi)通VIP
通過(guò)壓縮SOAP改善XML Web service性能
 
作者:佚名    文章來(lái)源:不詳    點(diǎn)擊數: 4    更新時(shí)間:2006-4-29    
壓縮文本是一個(gè)可以減少文本內容尺寸達80%的過(guò)程。這意味著(zhù)存儲壓縮的文本將會(huì )比存儲沒(méi)有壓縮的文本少80%的空間。也意味著(zhù)在網(wǎng)絡(luò )上傳輸內容需要更少的時(shí)間,對于使用文本通信的客戶(hù)端服務(wù)器應用程序來(lái)說(shuō),將會(huì )表現出更高的效率,例如XML Web Services。
本文的主要目的就是尋找在客戶(hù)端和服務(wù)器之間使交換的數據尺寸最小化的方法。一些有經(jīng)驗的開(kāi)發(fā)者會(huì )使用高級的技術(shù)來(lái)優(yōu)化通過(guò)網(wǎng)絡(luò )特別是互聯(lián)網(wǎng)傳送的數據,這樣的做法在許多分布式系統中都存在瓶頸。解決這個(gè)問(wèn)題的一個(gè)方法是獲取更多的帶寬,但這是不現實(shí)的。另一個(gè)方法是通過(guò)壓縮的方法使得被傳輸的數據達到最小。
當內容是文本的時(shí)候,通過(guò)壓縮,它的尺寸可以減少80%。這就意味著(zhù)在客戶(hù)端和服務(wù)器之間帶寬的需求也可以減少類(lèi)似的百分比。為了壓縮和解壓縮,服務(wù)端和客戶(hù)端則占用了CPU的額外資源。但升級服務(wù)器的CPU一般都會(huì )比增加帶寬便宜,所以壓縮是提高傳輸效率的最有效的方法。
XML/SOAP在網(wǎng)絡(luò )中
讓我們仔細看看SOAP在請求或響應XML Web service的時(shí)候,是什么在網(wǎng)絡(luò )上傳輸。我們創(chuàng )建一個(gè)XML Web service,它包含一個(gè) add 方法。這個(gè)方法有兩個(gè)輸入參數并返回這兩個(gè)數的和:
<WebMethod()> Public Function add(ByVal a As Integer, ByVal b As _
Integer) As Integer
add = a + b
End Function
當 XML Web service 消費端調用這個(gè)方法的時(shí)候,它確實(shí)發(fā)送了一個(gè)SOAP請求到服務(wù)器:
<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<soap:Body><add xmlns="1020http://tempuri.org/"><a>10</a><b>20</b></add>
</soap:Body></soap:Envelope>
服務(wù)端使用一個(gè)SOAP響應來(lái)回應這個(gè)SOAP請求:
<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<soap:Body><addResponse xmlns="http://tempuri.org/">
<addResult>30</addResult></addResponse>
</soap:Body></soap:Envelope>
這是調用XML Web service的方法后,在網(wǎng)絡(luò )上傳輸的實(shí)際信息。在更復雜的XML Web service中,SOAP響應可能是一個(gè)很大的數據集。例如,當Northwind中的表orders中的內容被序列化為XML后,數據可能達到454KB。如果我們創(chuàng )建一個(gè)應用通過(guò)XML Web service來(lái)獲取這個(gè)數據集,那么SOAP響應將會(huì )包含所有的數據。
為了提高效率,在傳輸之前,我們可以壓縮這些文本內容。我們怎樣才能做到呢?當然是使用SOAP擴展!
SOAP 擴展
SOAP擴展是ASP.net的Web方法調用的一個(gè)攔截機制,它能夠在SOAP請求或響應被傳輸之前操縱它們。開(kāi)發(fā)者可以寫(xiě)一段代碼在這些消息序列化之前和之后執行。(SOAP擴展提供底層的API來(lái)實(shí)現各種各樣的應用。)
使用SOAP擴展,當客戶(hù)端從XML Web service調用一個(gè)方法的時(shí)候,我們能夠減小SOAP信息在網(wǎng)絡(luò )上傳輸的尺寸。許多時(shí)候,SOAP請求要比SOAP響應小很多(例如,一個(gè)大的數據集),因此在我們的例子中,僅對SOAP響應進(jìn)行壓縮。就像你在圖1中所看到的,在服務(wù)端,當SOAP響應被序列化后,它會(huì )被壓縮,然后傳輸到網(wǎng)絡(luò )上。在客戶(hù)端,SOAP信息反序列化之前,為了使反序列化成功,SOAP信息會(huì )被解壓縮。
 
圖 1. SOAP信息在序列化后被壓縮(服務(wù)端),在反序列化前被解壓縮(客戶(hù)端)
我們也可以壓縮SOAP請求,但在這個(gè)例子中,這樣做的效率增加是不明顯的。
為了壓縮我們的Web service的SOAP響應,我們需要做兩件事情:
· 在服務(wù)端序列化SOAP響應信息后壓縮它。
· 在客戶(hù)端反序列化SOAP信息前解壓縮它。
這個(gè)工作將由SOAP擴展來(lái)完成。在下面的段落中,你可以看到所有的客戶(hù)端和服務(wù)端的代碼。
首先,這里是一個(gè)返回大數據集的XML Web service:
Imports System.Web.Services
<WebService(Namespace := "http://tempuri.org/")> _
Public Class Service1
Inherits System.Web.Services.WebService
<WebMethod()> Public Function getorders() As DataSet
Dim OleDbConnection1 = New System.Data.OleDb.OleDbConnection()
OleDbConnection1.ConnectionString = "Provider=SQLOLEDB.1; _
Integrated Security=SSPI;Initial Catalog=Northwind; _
Data Source=.;Workstation ID=T-MNIKIT;"
Dim OleDbCommand1 = New System.Data.OleDb.OleDbCommand()
OleDbCommand1.Connection = OleDbConnection1
OleDbConnection1.Open()
Dim OleDbDataAdapter1 = New System.Data.OleDb.OleDbDataAdapter()
OleDbDataAdapter1.SelectCommand = OleDbCommand1
OleDbCommand1.CommandText = "Select * from orders"
Dim objsampleset As New DataSet()
OleDbDataAdapter1.Fill(objsampleset, "Orders")
OleDbConnection1.Close()
Return objsampleset
End Function
End Class
在客戶(hù)端,我們構建了一個(gè)Windows應用程序來(lái)調用上面的XML Web service,獲取那個(gè)數據集并顯示在DataGrid中:
Public Class Form1
Inherits System.Windows.Forms.Form
‘‘This function invokes the XML Web service, which returns the dataset
‘‘without using compression.
Private Sub Button1_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles Button1.Click
Dim ws As New wstest.Service1()
Dim test1 As New ClsTimer()
‘‘Start time counting…
test1.StartTiming()
‘‘Fill datagrid with the dataset
DataGrid1.DataSource = ws.getorders()
test1.StopTiming()
‘‘Stop time counting…
TextBox5.Text = "Total time: " & test1.TotalTime.ToString & "msec"
End Sub
‘‘This function invokes the XML Web service, which returns the dataset
‘‘using compression.
Private Sub Button2_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles Button2.Click
Dim ws As New wstest2.Service1()
Dim test1 As New ClsTimer()
‘‘Start time counting…
test1.StartTiming()
‘‘Fill datagrid with dataset
DataGrid1.DataSource = ws.getorders()
test1.StopTiming()
‘‘Stop time counting…
TextBox4.Text = "Total time: " & test1.TotalTime.ToString & "msec"
End Sub
End Class
客戶(hù)端調用了兩個(gè)不同的XML Web services, 僅其中的一個(gè)使用了SOAP壓縮。下面的Timer類(lèi)是用來(lái)計算調用時(shí)間的:
Public Class ClsTimer
‘‘ Simple high resolution timer class
‘‘
‘‘ Methods:
‘‘ StartTiming reset timer and start timing
‘‘ StopTiming stop timer
‘‘
‘‘Properties
‘‘ TotalTime Time in milliseconds
‘‘Windows API function declarations
Private Declare Function timeGetTime Lib "winmm" () As Long
‘‘Local variable declarations
Private lngStartTime As Integer
Private lngTotalTime As Integer
Private lngCurTime As Integer
Public ReadOnly Property TotalTime() As String
Get
TotalTime = lngTotalTime
End Get
End Property
Public Sub StartTiming()
lngTotalTime = 0
lngStartTime = timeGetTime()
End Sub
Public Sub StopTiming()
lngCurTime = timeGetTime()
lngTotalTime = (lngCurTime - lngStartTime)
End Sub
End Class
服務(wù)端的SOAP擴展
在服務(wù)端,為了減小SOAP響應的尺寸,它被壓縮。下面這段告訴你怎么做:
第一步
使用Microsoft Visual Studio .NET, 我們創(chuàng )建一個(gè)新的Visual Basic .NET 類(lèi)庫項目(使用"ServerSoapExtension"作為項目名稱(chēng)),添加下面的類(lèi):
Imports System
Imports System.Web.Services
Imports System.Web.Services.Protocols
Imports System.IO
Imports zipper
Public Class myextension
Inherits SoapExtension
Private networkStream As Stream
Private newStream As Stream
Public Overloads Overrides Function GetInitializer(ByVal _
methodInfo As LogicalMethodInfo, _
ByVal attribute As SoapExtensionAttribute) As Object
Return System.DBNull.Value
End Function
Public Overloads Overrides Function GetInitializer(ByVal _
WebServiceType As Type) As Object
Return System.DBNull.Value
End Function
Public Overrides Sub Initialize(ByVal initializer As Object)
End Sub
Public Overrides Sub ProcessMessage(ByVal message As SoapMessage)
Select Case message.Stage
Case SoapMessageStage.BeforeSerialize
Case SoapMessageStage.AfterSerialize
AfterSerialize(message)
Case SoapMessageStage.BeforeDeserialize
BeforeDeserialize(message)
Case SoapMessageStage.AfterDeserialize
Case Else
Throw New Exception("invalid stage")
End Select
End Sub
‘‘ Save the stream representing the SOAP request or SOAP response into a
‘‘ local memory buffer.
Public Overrides Function ChainStream(ByVal stream As Stream) As Stream
networkStream = stream
newStream = New MemoryStream()
Return newStream
End Function
‘‘ Write the compressed SOAP message out to a file at
‘‘the server‘‘s file system..
Public Sub AfterSerialize(ByVal message As SoapMessage)
newStream.Position = 0
Dim fs As New FileStream("c:\temp\server_soap.txt", _
FileMode.Append, FileAccess.Write)
Dim w As New StreamWriter(fs)
w.WriteLine("-----Response at " + DateTime.Now.ToString())
w.Flush()
‘‘Compress stream and save it to a file
Comp(newStream, fs)
w.Close()
newStream.Position = 0
‘‘Compress stream and send it to the wire
Comp(newStream, networkStream)
End Sub
‘‘ Write the SOAP request message out to a file at the server‘‘s file system.
Public Sub BeforeDeserialize(ByVal message As SoapMessage)
Copy(networkStream, newStream)
Dim fs As New FileStream("c:\temp\server_soap.txt", _
FileMode.Create, FileAccess.Write)
Dim w As New StreamWriter(fs)
w.WriteLine("----- Request at " + DateTime.Now.ToString())
w.Flush()
newStream.Position = 0
Copy(newStream, fs)
w.Close()
newStream.Position = 0
End Sub
Sub Copy(ByVal fromStream As Stream, ByVal toStream As Stream)
Dim reader As New StreamReader(fromStream)
Dim writer As New StreamWriter(toStream)
writer.WriteLine(reader.ReadToEnd())
writer.Flush()
End Sub
Sub Comp(ByVal fromStream As Stream, ByVal toStream As Stream)
Dim reader As New StreamReader(fromStream)
Dim writer As New StreamWriter(toStream)
Dim test1 As String
Dim test2 As String
test1 = reader.ReadToEnd
‘‘String compression using NZIPLIB
test2 = zipper.Class1.Compress(test1)
writer.WriteLine(test2)
writer.Flush()
End Sub
End Class
‘‘ Create a SoapExtensionAttribute for the SOAP extension that can be
‘‘ applied to an XML Web service method.
<AttributeUsage(AttributeTargets.Method)> _
Public Class myextensionattribute
Inherits SoapExtensionAttribute
Public Overrides ReadOnly Property ExtensionType() As Type
Get
Return GetType(myextension)
End Get
End Property
Public Overrides Property Priority() As Integer
Get
Return 1
End Get
Set(ByVal Value As Integer)
End Set
End Property
End Class
第二步
我們增加ServerSoapExtension.dll程序集作為引用,并且在web.config聲明SOAP擴展:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<system.web>
<webServices>
<soapExtensionTypes>
<add type="ServerSoapExtension.myextension,
ServerSoapExtension" priority="1" group="0"/>
</soapExtensionTypes>
</webServices>
...
</system.web>
</configuration>
就象你在代碼中看到的那樣,我們使用了一個(gè)臨時(shí)目錄("c:\temp")來(lái)捕獲SOAP請求和壓縮過(guò)的SOAP響應到文本文件("c:\temp\server_soap.txt")中 。
客戶(hù)端的SOAP擴展
在客戶(hù)端,從服務(wù)器來(lái)的SOAP響應被解壓縮,這樣就可以獲取原始的響應內容。下面就一步一步告訴你怎么做:
第一步
使用Visual Studio .NET, 我們創(chuàng )建一個(gè)新的Visual Basic .NET類(lèi)庫項目(使用 "ClientSoapExtension"作為項目名稱(chēng)),并且添加下面的類(lèi):
Imports System
Imports System.Web.Services
Imports System.Web.Services.Protocols
Imports System.IO
Imports zipper
Public Class myextension
Inherits SoapExtension
Private networkStream As Stream
Private newStream As Stream
Public Overloads Overrides Function GetInitializer(ByVal _
methodInfo As LogicalMethodInfo, _
ByVal attribute As SoapExtensionAttribute) As Object
Return System.DBNull.Value
End Function
Public Overloads Overrides Function GetInitializer(ByVal _
WebServiceType As Type) As Object
Return System.DBNull.Value
End Function
Public Overrides Sub Initialize(ByVal initializer As Object)
End Sub
Public Overrides Sub ProcessMessage(ByVal message As SoapMessage)
Select Case message.Stage
Case SoapMessageStage.BeforeSerialize
Case SoapMessageStage.AfterSerialize
AfterSerialize(message)
Case SoapMessageStage.BeforeDeserialize
BeforeDeserialize(message)
Case SoapMessageStage.AfterDeserialize
Case Else
Throw New Exception("invalid stage")
End Select
End Sub
‘‘ Save the stream representing the SOAP request or SOAP response
‘‘ into a local memory buffer.
Public Overrides Function ChainStream(ByVal stream As Stream) _
As Stream
networkStream = stream
newStream = New MemoryStream()
Return newStream
End Function
‘‘ Write the SOAP request message out to a file at
‘‘ the client‘‘s file system.
Public Sub AfterSerialize(ByVal message As SoapMessage)
newStream.Position = 0
Dim fs As New FileStream("c:\temp\client_soap.txt", _
FileMode.Create, FileAccess.Write)
Dim w As New StreamWriter(fs)
w.WriteLine("----- Request at " + DateTime.Now.ToString())
w.Flush()
Copy(newStream, fs)
w.Close()
newStream.Position = 0
Copy(newStream, networkStream)
End Sub
‘‘ Write the uncompressed SOAP message out to a file
‘‘ at the client‘‘s file system..
Public Sub BeforeDeserialize(ByVal message As SoapMessage)
‘‘Decompress the stream from the wire
DeComp(networkStream, newStream)
Dim fs As New FileStream("c:\temp\client_soap.txt", _
FileMode.Append, FileAccess.Write)
Dim w As New StreamWriter(fs)
w.WriteLine("-----Response at " + DateTime.Now.ToString())
w.Flush()
newStream.Position = 0
‘‘Store the uncompressed stream to a file
Copy(newStream, fs)
w.Close()
newStream.Position = 0
End Sub
Sub Copy(ByVal fromStream As Stream, ByVal toStream As Stream)
Dim reader As New StreamReader(fromStream)
Dim writer As New StreamWriter(toStream)
writer.WriteLine(reader.ReadToEnd())
writer.Flush()
End Sub
Sub DeComp(ByVal fromStream As Stream, ByVal toStream As Stream)
Dim reader As New StreamReader(fromStream)
Dim writer As New StreamWriter(toStream)
Dim test1 As String
Dim test2 As String
test1 = reader.ReadToEnd
‘‘String decompression using NZIPLIB
test2 = zipper.Class1.DeCompress(test1)
writer.WriteLine(test2)
writer.Flush()
End Sub
End Class
‘‘ Create a SoapExtensionAttribute for the SOAP extension that can be
‘‘ applied to an XML Web service method.
<AttributeUsage(AttributeTargets.Method)> _
Public Class myextensionattribute
Inherits SoapExtensionAttribute
Public Overrides ReadOnly Property ExtensionType() As Type
Get
Return GetType(myextension)
End Get
End Property
Public Overrides Property Priority() As Integer
Get
Return 1
End Get
Set(ByVal Value As Integer)
End Set
End Property
End Class
就象你在代碼中看到的那樣,我們使用了一個(gè)臨時(shí)目錄("c:\temp") 來(lái)捕獲SOAP請求和解壓縮的SOAP響應到文本文件("c:\temp\client_soap.txt")中。
第二步
我們添加ClientSoapExtension.dll程序集作為引用,并且在我們的應用程序的XML Web service引用中聲明SOAP擴展:
‘‘-------------------------------------------------------------------------
‘‘ <autogenerated>
‘‘ This code was generated by a tool.
‘‘ Runtime Version: 1.0.3705.209
‘‘
‘‘ Changes to this file may cause incorrect behavior and will be lost if
‘‘ the code is regenerated.
‘‘ </autogenerated>
‘‘-------------------------------------------------------------------------
Option Strict Off
Option Explicit On
Imports System
Imports System.ComponentModel
Imports System.Diagnostics
Imports System.Web.Services
Imports System.Web.Services.Protocols
Imports System.Xml.Serialization
‘‘
‘‘This source code was auto-generated by Microsoft.VSDesigner,
‘‘Version 1.0.3705.209.
‘‘
Namespace wstest2
‘‘<remarks/>
<System.Diagnostics.DebuggerStepThroughAttribute(), _
System.ComponentModel.DesignerCategoryAttribute("code"), _
System.Web.Services.WebServiceBindingAttribute(Name:="Service1Soap", _
[Namespace]:="http://tempuri.org/")> _
Public Class Service1
Inherits System.Web.Services.Protocols.SoapHttpClientProtocol
‘‘<remarks/>
Public Sub New()
MyBase.New
Me.Url = "http://localhost/CompressionWS/Service1.asmx"
End Sub
‘‘<remarks/>
<System.Web.Services.Protocols.SoapDocumentMethodAttribute _
("http://tempuri.org/getproducts",RequestNamespace:= _
"http://tempuri.org/", ResponseNamespace:="http://tempuri.org/", _
Use:=System.Web.Services.Description.SoaPBindingUse.Literal,_
ParameterStyle:=System.Web.Services.Protocols.SoapParameterStyle _
.Wrapped), ClientSoapExtension.myextensionattribute()> _
Public Function getproducts() As System.Data.DataSet
Dim results() As Object = Me.Invoke("getproducts", _
New Object(-1) {})
Return CType(results(0), System.Data.DataSet)
End Function
‘‘<remarks/>
Public Function Begingetproducts(ByVal callback As _
System.AsyncCallback, ByVal asyncState As Object) As System.IAsyncResult _
Return Me.BeginInvoke("getproducts", New Object(-1) {}, _
callback, asyncState)
End Function
‘‘<remarks/>
Public Function Endgetproducts(ByVal asyncResult As _
System.IAsyncResult) As System.Data.DataSet
Dim results() As Object = Me.EndInvoke(asyncResult)
Return CType(results(0), System.Data.DataSet)
End Function
End Class
End Namespace
這里是zipper類(lèi)的源代碼,它是使用免費軟件NZIPLIB庫實(shí)現的:
using System;
using NZlib.GZip;
using NZlib.Compression;
using NZlib.Streams;
using System.IO;
using System.Net;
using System.Runtime.Serialization;
using System.Xml;
namespace zipper
{
public class Class1
{
public static string Compress(string uncompressedString)
{
byte[] bytData = System.Text.Encoding.UTF8.GetBytes(uncompressedString);
MemoryStream ms = new MemoryStream();
Stream s = new DeflaterOutputStream(ms);
s.Write(bytData, 0, bytData.Length);
s.Close();
byte[] compressedData = (byte[])ms.ToArray();
return System.Convert.ToBase64String(compressedData, 0, _
compressedData.Length);
}
public static string DeCompress(string compressedString)
{
string uncompressedString="";
int totalLength = 0;
byte[] bytInput = System.Convert.FromBase64String(compressedString);;
byte[] writeData = new byte[4096];
Stream s2 = new InflaterInputStream(new MemoryStream(bytInput));
while (true)
{
int size = s2.Read(writeData, 0, writeData.Length);
if (size > 0)
{
totalLength += size;
uncompressedString+=System.Text.Encoding.UTF8.GetString(writeData, _
0, size);
}
else
{
break;
}
}
s2.Close();
return uncompressedString;
}
}
}
分析
軟件&硬件
· 客戶(hù)方: Intel Pentium III 500 MHz, 512 MB RAM, Windows XP.
· 服務(wù)器方: Intel Pentium III 500 MHz, 512 MB RAM, Windows 2000 Server, Microsoft SQL Server 2000.
在客戶(hù)端,一個(gè)Windows應用程序調用一個(gè)XML Web service。這個(gè)XML Web service 返回一個(gè)數據集并且填充客戶(hù)端應用程序中的DataGrid。
 
圖2. 這是一個(gè)我們通過(guò)使用和不使用SOAP壓縮調用相同的XML Web Service的樣例程序。這個(gè)XML Web service返回一個(gè)大的數據集。
CPU 使用記錄
就象在圖3中顯示的那樣,沒(méi)有使用壓縮的CPU使用時(shí)間是 29903 milliseconds.
 
圖 3. 沒(méi)有使用壓縮的CPU使用記錄
在我們的例子中,使用壓縮的CPU使用時(shí)間顯示在圖4中, 是15182 milliseconds.
 
圖 4. 使用壓縮的CPU 使用記錄
正如你看到的,我們在客戶(hù)方獲取這個(gè)數據集的時(shí)候,使用壓縮與不使用壓縮少用了近50%的CPU時(shí)間,僅僅在CPU加載時(shí)有一點(diǎn)影響。當客戶(hù)端和服務(wù)端交換大的數據時(shí),SOAP壓縮能顯著(zhù)地增加X(jué)ML Web Services效率。 在Web中,有許多改善效率的解決方案。我們的代碼是獲取最大成果但是最便宜的解決方案。SOAP擴展是通過(guò)壓縮交換數據來(lái)改善XML Web Services性能的,這僅僅對CPU加載時(shí)間造成了一點(diǎn)點(diǎn)影響。并且值得提醒的是,大家可以使用更強大的和需要更小資源的壓縮算法來(lái)獲取更大的效果
本站僅提供存儲服務(wù),所有內容均由用戶(hù)發(fā)布,如發(fā)現有害或侵權內容,請點(diǎn)擊舉報。
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
VB.NET 讀取寫(xiě)入XML文件
如何:使用 SOAP 頭執行自定義身份驗證
vb.net 打印代碼
詳解VB.net文件傳輸.(可傳輸任意文件)
VB實(shí)例教程之操作Access數據庫
VB.NET 對字符串進(jìn)行加密和解密的方法
更多類(lèi)似文章 >>
生活服務(wù)
分享 收藏 導長(cháng)圖 關(guān)注 下載文章
綁定賬號成功
后續可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服

欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久