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

首頁 > 開發(fā) > XML > 正文

通過壓縮SOAP改善XML Web service性能

2024-09-05 20:56:01
字體:
供稿:網(wǎng)友


壓縮文本是一個(gè)可以減少文本內(nèi)容尺寸達(dá)80%的過程。這意味著存儲(chǔ)壓縮的文本將會(huì)比存儲(chǔ)沒有壓縮的文本少80%的空間。也意味著在網(wǎng)絡(luò)上傳輸內(nèi)容需要更少的時(shí)間,對(duì)于使用文本通信的客戶端服務(wù)器應(yīng)用程序來說,將會(huì)表現(xiàn)出更高的效率,例如xml web services。

本文的主要目的就是尋找在客戶端和服務(wù)器之間使交換的數(shù)據(jù)尺寸最小化的方法。一些有經(jīng)驗(yàn)的開發(fā)者會(huì)使用高級(jí)的技術(shù)來優(yōu)化通過網(wǎng)絡(luò)特別是互聯(lián)網(wǎng)傳送的數(shù)據(jù),這樣的做法在許多分布式系統(tǒng)中都存在瓶頸。解決這個(gè)問題的一個(gè)方法是獲取更多的帶寬,但這是不現(xiàn)實(shí)的。另一個(gè)方法是通過壓縮的方法使得被傳輸?shù)臄?shù)據(jù)達(dá)到最小。

當(dāng)內(nèi)容是文本的時(shí)候,通過壓縮,它的尺寸可以減少80%。這就意味著在客戶端和服務(wù)器之間帶寬的需求也可以減少類似的百分比。為了壓縮和解壓縮,服務(wù)端和客戶端則占用了cpu的額外資源。但升級(jí)服務(wù)器的cpu一般都會(huì)比增加帶寬便宜,所以壓縮是提高傳輸效率的最有效的方法。

xml/soap在網(wǎng)絡(luò)中

讓我們仔細(xì)看看soap在請(qǐng)求或響應(yīng)xml web service的時(shí)候,是什么在網(wǎng)絡(luò)上傳輸。我們創(chuàng)建一個(gè)xml web service,它包含一個(gè) add 方法。這個(gè)方法有兩個(gè)輸入?yún)?shù)并返回這兩個(gè)數(shù)的和:

<webmethod()> public function add(byval a as integer, byval b as _integer) as integer
add = a + b
end function

當(dāng) xml web service 消費(fèi)端調(diào)用這個(gè)方法的時(shí)候,它確實(shí)發(fā)送了一個(gè)soap請(qǐng)求到服務(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="http://tempuri.org/"><a>10</a><b>20</b></add>
</soap:body></soap:envelope>

服務(wù)端使用一個(gè)soap響應(yīng)來回應(yīng)這個(gè)soap請(qǐng)求:

<?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>

這是調(diào)用xml web service的方法后,在網(wǎng)絡(luò)上傳輸?shù)膶?shí)際信息。在更復(fù)雜的xml web service中,soap響應(yīng)可能是一個(gè)很大的數(shù)據(jù)集。例如,當(dāng)northwind中的表orders中的內(nèi)容被序列化為xml后,數(shù)據(jù)可能達(dá)到454kb。如果我們創(chuàng)建一個(gè)應(yīng)用通過xml web service來獲取這個(gè)數(shù)據(jù)集,那么soap響應(yīng)將會(huì)包含所有的數(shù)據(jù)。

為了提高效率,在傳輸之前,我們可以壓縮這些文本內(nèi)容。我們?cè)鯓硬拍茏龅侥???dāng)然是使用soap擴(kuò)展!

soap 擴(kuò)展

soap擴(kuò)展是asp.net的web方法調(diào)用的一個(gè)攔截機(jī)制,它能夠在soap請(qǐng)求或響應(yīng)被傳輸之前操縱它們。開發(fā)者可以寫一段代碼在這些消息序列化之前和之后執(zhí)行。(soap擴(kuò)展提供底層的api來實(shí)現(xiàn)各種各樣的應(yīng)用。)

使用soap擴(kuò)展,當(dāng)客戶端從xml web service調(diào)用一個(gè)方法的時(shí)候,我們能夠減小soap信息在網(wǎng)絡(luò)上傳輸?shù)某叽?。許多時(shí)候,soap請(qǐng)求要比soap響應(yīng)小很多(例如,一個(gè)大的數(shù)據(jù)集),因此在我們的例子中,僅對(duì)soap響應(yīng)進(jìn)行壓縮。就像你在圖1中所看到的,在服務(wù)端,當(dāng)soap響應(yīng)被序列化后,它會(huì)被壓縮,然后傳輸?shù)骄W(wǎng)絡(luò)上。在客戶端,soap信息反序列化之前,為了使反序列化成功,soap信息會(huì)被解壓縮。




圖 1. soap信息在序列化后被壓縮(服務(wù)端),在反序列化前被解壓縮(客戶端)

我們也可以壓縮soap請(qǐng)求,但在這個(gè)例子中,這樣做的效率增加是不明顯的。

為了壓縮我們的web service的soap響應(yīng),我們需要做兩件事情:

· 在服務(wù)端序列化soap響應(yīng)信息后壓縮它。
· 在客戶端反序列化soap信息前解壓縮它。

這個(gè)工作將由soap擴(kuò)展來完成。在下面的段落中,你可以看到所有的客戶端和服務(wù)端的代碼。

首先,這里是一個(gè)返回大數(shù)據(jù)集的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



在客戶端,我們構(gòu)建了一個(gè)windows應(yīng)用程序來調(diào)用上面的xml web service,獲取那個(gè)數(shù)據(jù)集并顯示在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

客戶端調(diào)用了兩個(gè)不同的xml web services, 僅其中的一個(gè)使用了soap壓縮。下面的timer類是用來計(jì)算調(diào)用時(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擴(kuò)展

在服務(wù)端,為了減小soap響應(yīng)的尺寸,它被壓縮。下面這段告訴你怎么做:

第一步

使用microsoft visual studio .net, 我們創(chuàng)建一個(gè)新的visual basic .net 類庫項(xiàng)目(使用"serversoapextension"作為項(xiàng)目名稱),添加下面的類:

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



第二步

我們?cè)黾觭erversoapextension.dll程序集作為引用,并且在web.config聲明soap擴(kuò)展:

<?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")來捕獲soap請(qǐng)求和壓縮過的soap響應(yīng)到文本文件("c:/temp/server_soap.txt")中 。

客戶端的soap擴(kuò)展

在客戶端,從服務(wù)器來的soap響應(yīng)被解壓縮,這樣就可以獲取原始的響應(yīng)內(nèi)容。下面就一步一步告訴你怎么做:

第一步

使用visual studio .net, 我們創(chuàng)建一個(gè)新的visual basic .net類庫項(xiàng)目(使用 "clientsoapextension"作為項(xiàng)目名稱),并且添加下面的類:

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") 來捕獲soap請(qǐng)求和解壓縮的soap響應(yīng)到文本文件("c:/temp/client_soap.txt")中。

第二步

我們添加clientsoapextension.dll程序集作為引用,并且在我們的應(yīng)用程序的xml web service引用中聲明soap擴(kuò)展:

''-------------------------------------------------------------------------
'' <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類的源代碼,它是使用免費(fèi)軟件nziplib庫實(shí)現(xiàn)的:

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;
}
}
}



分析

軟件&硬件

· 客戶方: 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.

在客戶端,一個(gè)windows應(yīng)用程序調(diào)用一個(gè)xml web service。這個(gè)xml web service 返回一個(gè)數(shù)據(jù)集并且填充客戶端應(yīng)用程序中的datagrid。



圖2. 這是一個(gè)我們通過使用和不使用soap壓縮調(diào)用相同的xml web service的樣例程序。這個(gè)xml web service返回一個(gè)大的數(shù)據(jù)集。

cpu 使用記錄

就象在圖3中顯示的那樣,沒有使用壓縮的cpu使用時(shí)間是 29903 milliseconds.



圖 3. 沒有使用壓縮的cpu使用記錄

在我們的例子中,使用壓縮的cpu使用時(shí)間顯示在圖4中, 是15182 milliseconds.



圖 4. 使用壓縮的cpu 使用記錄

正如你看到的,我們?cè)诳蛻舴将@取這個(gè)數(shù)據(jù)集的時(shí)候,使用壓縮與不使用壓縮少用了近50%的cpu時(shí)間,僅僅在cpu加載時(shí)有一點(diǎn)影響。當(dāng)客戶端和服務(wù)端交換大的數(shù)據(jù)時(shí),soap壓縮能顯著地增加xml web services效率。 在web中,有許多改善效率的解決方案。我們的代碼是獲取最大成果但是最便宜的解決方案。soap擴(kuò)展是通過壓縮交換數(shù)據(jù)來改善xml web services性能的,這僅僅對(duì)cpu加載時(shí)間造成了一點(diǎn)點(diǎn)影響。并且值得提醒的是,大家可以使用更強(qiáng)大的和需要更小資源的壓縮算法來獲取更大的效果
發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
亚洲久久视频| 中文字幕在线视频第一页| 欧美国产日韩精品免费观看| 亚洲高清毛片一区二区| 日韩午夜在线| 久久久777精品电影网影网| 先锋影音欧美四级| 中文字幕日韩欧美在线| 国产精品sm调教免费专区| 人人妻人人澡人人爽人人精品| 66精品视频在线观看| 日韩中文字幕久久| 公侵犯人妻一区二区三区| 欧美国产一区二区在线观看| 波多野结衣一区二区三区免费视频| 久精品免费视频| 国内精品久久久久久久久电影网| 国产一区二区三区四区五区传媒| 天天操天天干天天干| 欧美激情在线一区| 国产99久久精品一区二区永久免费| 欧美日韩一区二区三区四区在线观看| 麻豆专区一区二区三区四区五区| 欧美视频在线看| 一区二区三区四区在线播放| 欧美一卡二卡三卡四卡| 1区2区3区欧美| 中文日本在线观看| 精品伦理一区二区三区| 97在线视频免费| 成人情趣视频网站| 国产精品高清在线观看| 国产无套粉嫩白浆在线2022年| 欧美自拍偷拍一区二区| 亚洲高清视频在线播放| 欧美国产激情| 全彩无遮拦全彩口工漫画全彩| 成人激情免费视频| 日韩电影网1区2区| 亚洲欧美日本一区二区| 日韩欧美精品免费| 中文字幕+乱码+中文| 久久手机免费观看| www.66久久| 99久久精品国产一区二区成人| 日韩福利片在线观看| 人交獸av完整版在线观看| 91精品国产综合久久香蕉的特点| 日韩一区在线看| 免费网站在线观看视频| 青青草娱乐视频| 国产免费xxx| а√中文在线8| 嫩草精品影院| 国产探花视频在线| 不卡的av在线播放| 亚洲韩日在线| 亚洲小说区图片区| 影音先锋男人看片资源| 亚洲成人一品| 久久99国产精品久久99小说| 国产午夜精品久久久久免费视| 亚洲欧美一级二级三级| 亚洲深深色噜噜狠狠爱网站| 日韩av网站在线观看| 蜜桃特黄a∨片免费观看| 日本三级韩国三级久久| 91麻豆国产福利精品| 国产高清视频色在线www| 男人的天堂成人| 污网站在线观看免费| 欧美国产日韩一区二区在线观看| 91视频网页| 国产精品最新自拍| 国产精品99久久久久久白浆小说| 亚洲精品国产一区黑色丝袜| 波霸ol色综合久久| 午夜精品久久久久久久99| 亚洲男人天堂色| 成人日韩在线电影| 在线高清欧美| 国产成人综合一区二区三区| 亚洲视频三区| jiuse.com91视频| 岛国精品在线| 欧美国产一区二区在线| 欧美人与动牲性行为| 91精品国产91久久| 黄色一区三区| 巨大黑人video| 国产精品99一区二区三区| 91大神在线网站| 18深夜在线观看免费视频| 日韩欧美国产一区二区三区| 久久九九全国免费| 秋霞一区二区| 亚洲一区二区三区四区av| 色8久久人人97超碰香蕉987| 99爱在线视频| 国产毛片久久久久久国产毛片| 午夜免费福利小电影| 日韩美女一区二区三区四区| 热re66久久精品国产99热| www.亚洲激情| www.色五月.com| 久久久亚洲国产天美传媒修理工| 国产av无码专区亚洲av| 亚洲风情亚aⅴ在线发布| 无码h肉动漫在线观看| 黄色漫画在线免费观看| 国产一区二区三区成人| 日韩精品一区二区三区免费视频| 国产91久久精品一区二区| 成年人午夜视频在线观看| 欧美性xxxx极品hd欧美| 欧美精品一区二区在线播放| 亚洲桃色在线一区| 亚洲高清精品中出| 日韩在线三区| 欧美日韩亚洲国产另类| 综合综合综合综合综合网| 亚洲第一黄色网| 在线看黄网址| 30一40一50老女人毛片| 伊人蜜桃色噜噜激情综合| 日本中文字幕伦在线观看| 九七影院理伦片| 欧美成人午夜剧场免费观看| 日韩av三级在线观看| 国产人妖ts一区二区| 国产调教在线| 色综合久久久久久久久| 成人高清伦理免费影院在线观看| 精品久久久无码人妻字幂| 国产福利第一视频在线播放| 久久男人av| 一区二区三区免费高清视频| 国产精品无码久久久久一区二区| 亚洲ⅴ国产v天堂a无码二区| 91在线高清视频| 日本精品视频一区二区三区| 久久精品久久久| 在线观看免费视频国产| 日韩av片在线看| 亚洲激情网站| 在线观看的日韩av| 久久不卡国产精品一区二区| 午夜欧美巨大性欧美巨大| 欧美精品tushy高清| 色哟哟免费在线观看| 四虎影院在线免费播放| 成人久久在线| 国产精品三级久久久久久电影| 国产精品久久久久桃色tv| 99re66热这里只有精品4| 日本三级小视频| 日韩一区在线免费观看| 欧美日韩一区二区视频在线| 亚欧精品在线| 欧美日韩看看2015永久免费| 91九色在线免费视频| 国产乱码精品一区二区三区日韩精品| 免费在线a视频| 真人bbbbbbbbb毛片| 成人aaaa| 日本免费一区视频| 中文字幕在线观看成人| 国产91色在线|免| 精品久久香蕉国产线看观看gif| 激情五月深爱五月| 欧美日韩人人澡狠狠躁视频| 五十路亲子中出中文字幕| 亚洲永久精品免费| 蜜桃一区二区三区| 三级黄色片在线观看| 免费网站观看www在线观看| 顶级欧美妇高清xxxxx| 欧美日韩视频专区在线播放| 三级小说欧洲区亚洲区| 国产探花一区二区三区| 久久精品无码一区二区日韩av| 亚洲精品福利免费在线观看| 国产成人av资源| 精品一二三四五区| 口述被爽到呻吟高潮自述| 国产乱子伦一区二区三区国色天香| 久久九九精品视频| 九九精品视频免费| 欧美精品卡一卡二| 欧美在线一级| 久久蜜桃av一区二区天堂| 无码人妻精品一区二区三区夜夜嗨| 欧美日韩的一区二区| 精品久久久久久久久久久久久久久久久| 亚洲激情在线观看视频免费| 加勒比久久高清| 欧美精品国产精品日韩精品| 亚洲第一se情网站| 欧美三级在线观看视频| 国产后进白嫩翘臀在线观看视频| 国产亚洲一卡2卡3卡4卡新区| 搡的我好爽在线观看免费视频| 午夜精品短视频| 亚洲一区欧美在线| 成人国产精品日本在线| 久久国产精品亚洲人一区二区三区| 日韩欧美一区二区免费| 亚洲激情图片qvod| 新久草在线视频| 欧美日韩在线观看成人| 大肉大捧一进一出好爽视频| 色综合夜色一区| 国自产精品手机在线观看视频| 欧美猛少妇色xxxxx| 亚洲国产裸拍裸体视频在线观看乱了| 波多野结衣手机在线视频| 91片在线免费观看| 精品动漫一区二区三区在线观看| 精品人体无码一区二区三区| 伊人一区二区三区| 婷婷综合社区| 日韩精品中文字幕一区二区三区| 亚洲天堂av综合网| 在线观看美女网站大全免费| 18被视频免费观看视频| 成人免费大片黄在线播放| 最新欧美人z0oozo0| 日韩av影视在线| 国产精品视频分类| 精选一区二区三区四区五区| 国产精品久久三| www.色婷婷.com| 日本在线观看中文字幕| 中文精品视频一区二区在线观看| 日韩欧美国产成人| 欧美mv日韩mv国产| 日本亚洲欧洲精品| 久青草视频在线观看| 久久精品水蜜桃av综合天堂| 美女视频一区免费观看| 亚洲精品国产精品国自产观看| 亚洲视频免费在线观看| 精品无码在线观看| 成年女人免费又黄又爽视频| 欧美一区二区视频在线播放| 亚洲专区在线播放| 国模gogo一区二区大胆私拍| 国色天香一区二区| 香蕉精品视频在线| 1区1区3区4区产品乱码芒果精品| 激情久久久久久| 欧美日韩精品专区| 久久久久久久高潮| 欧美久久影院| www.色综合.com| 亚洲无码精品一区二区三区| 国产精品永久| 欧美少妇另类| 六月丁香激情综合| 色狠狠av一区二区三区香蕉蜜桃| 欧美福利网站| 男生操女生视频网站| 欧美行性性性o00x| 制服丝袜亚洲精品中文字幕| 91中文字幕| 37pao成人国产永久免费视频| 国产精品色婷婷在线观看| 色婷婷亚洲综合| 一级片在线观看免费| 一区二区三区天堂av| 捆绑紧缚一区二区三区在线观看| 日本一区二区视频在线| 久久69精品久久久久久国产越南| 青青在线免费观看| 天天操天天射天天色| 97视频在线观看免费高清完整版在线观看| 欧美日韩国产首页| 亚洲一区二区在线免费观看| 国产无遮挡aaa片爽爽| 亚洲精品中文字幕在线| 亚州综合一区| 成人午夜激情av| 亚洲色精品三区二区一区| 国产精品久久久久久久久久久久久久久| 精品亚洲aⅴ无码一区二区三区| 久久免费小视频| 国产真实生活伦对白| zzjj国产精品一区二区| 中文字幕先锋av影音资源网| 麻豆一区一区三区四区| 亚洲国产视频二区| 久久久久亚洲精品一区二区三区| 精品久久久香蕉免费精品视频| 播放灌醉水嫩大学生国内精品| 雨宫琴音一区二区在线| 日韩电视剧在线观看免费网站| 欧美肥臀大乳一区二区免费视频| 中文字幕一区日韩精品欧美| 国产美女无遮挡网站| av中文字幕电影在线看| 免费在线小视频| 中文字幕av日韩| 国产日韩欧美视频| 成人黄色在线| 99不卡视频| 5月丁香婷婷综合| av影音资源网| 最新真实国产在线视频| 麻豆91在线播放| 久久久久久久国产精品毛片| 国产伦精品一区二区三区免| 亚洲综合免费观看高清完整版在线| 69堂国产成人免费视频| 国产成人无码av在线播放dvd| 亚洲欧洲在线播放| 91极品女神私人尤物在线播放| 成人av动漫在线观看| 久久在线精品视频| 久久网站热最新地址| 久久天堂久久| 欧美成人精品一区二区三区在线看| 日韩av一卡二卡三卡| 精品国产网站在线观看| 久久嫩草精品久久久久| 色先锋av男人资源先锋影院| 特一级黄色片| 久久看人人爽人人| 国产色综合一区二区三区|