一区二区久久-一区二区三区www-一区二区三区久久-一区二区三区久久精品-麻豆国产一区二区在线观看-麻豆国产视频

[WCF中的Binding模型]之六(完結(jié)篇):從綁定元素認(rèn)識系統(tǒng)預(yù)定義綁定

由于綁定對象由一系列有序的綁定元素組成,綁定元素最終決定著信道棧中信道的組成,而信道的組成最終又決定了信道棧對消息進(jìn)行處理的方式和能力,所有要確定綁定的特性和能力,我們可以通過查看其綁定元素的構(gòu)成來一窺究竟。為此我們我們寫了一個簡單的方法,用于列出一個具體的綁定對象所有的綁定元素,在介紹一個個具體的系統(tǒng)綁定中,我會使用該方法:

static void ListAllBindingElements(Binding binding)
{
BindingElementCollection elements = binding.CreateBindingElements();
for (int i = 0; i < elements.Count; i++)
{
Console.WriteLine("{0}. {1}", i+1, elements[i].GetType().FullName);
}
}

1.BasicHttpBinding

我們通過調(diào)用默認(rèn)的構(gòu)造函數(shù)創(chuàng)建一個綁定對象,并借助上面的ListAllBindingElements方法列出該綁定對象所有的綁定元素:

class Program
{
static void Main(string[] args)
{
BasicHttpBinding binding = new BasicHttpBinding();
ListAllBindingElements(binding);
}
}

將會得到如下的輸出,從中可以看出在默認(rèn)的情況下,一個BasicHttpBinding包含兩個最基本的綁定元素:最為傳輸元素的HttpTransportBindingElement和作為消息編碼元素的TextMessageEncodingBindingElement。所以BasicHttpBinding在默認(rèn)的情況下采用HTTP傳輸協(xié)議,和基于文本的消息編碼方式。之所以將此綁定命名為BasicHttpBinding,很大程度上緣于它僅僅包含一些最基本的用于消息通信的元素。

1. System.ServiceModel.Channels.TextMessageEncodingBindingElement
2. System.ServiceModel.Channels.HttpTransportBindingElement

除了提供最基本的傳輸和編碼功能外,BasicHttpBinding還提供了對安全的支持,無論是基于傳輸?shù)陌踩€是基于消息的安全,都可以通過對綁定進(jìn)行相應(yīng)的設(shè)置實現(xiàn)。我們同樣通過列出綁定元素的方式來證明這一點。下面的代碼中,在創(chuàng)建BasicHttpBinding對象的時候,指定一個BasicHttpSecurityMode.Transport參數(shù)將安全模式設(shè)為傳輸安全模式:

class Program
{
static void Main(string[] args)
{
BasicHttpBinding binding = new BasicHttpBinding(BasicHttpSecurityMode.Transport);
ListAllBindingElements(binding);
}
}

在最終的輸出中我們可以看到,傳輸綁定元素由HttpTransportBindingElement變成了HttpsTransportBindingElement,由此可以看出BasicHttpBinding通過HTTPS實現(xiàn)傳輸安全。

1. System.ServiceModel.Channels.TextMessageEncodingBindingElement
2. System.ServiceModel.Channels.HttpsTransportBindingElement

如果我們設(shè)置成基于消息的安全模式,并將客戶端的憑證類型(Client Credential Type)設(shè)為證書(Certificate,這對于基于消息安全模式的BasicHttpBinding是必須的)。

class Program
{
static void Main(string[] args)
{
BasicHttpBinding binding = new BasicHttpBinding(BasicHttpSecurityMode.Message);
binding.Security.Message.ClientCredentialType = BasicHttpMessageCredentialType.Certificate;
ListAllBindingElements(binding);
}
}

那么通過輸出,我們可以看到在原有綁定元素之上,又多出了一個新的綁定元素:AsymmetricSecurityBindingElement,該元素通過非對稱加密(也就是基于X509證書的加密方式)的方式實現(xiàn)了基于消息的安全。

1. System.ServiceModel.Channels.AsymmetricSecurityBindingElement
2. System.ServiceModel.Channels.TextMessageEncodingBindingElement
3. System.ServiceModel.Channels.HttpsTransportBindingElement

對于BasicHttpBinding來說,默認(rèn)采用基于文本的消息編碼方式(TextMessageEncodingBindingElement),實際上BasicHttpBinding還提供對基于MTOM編碼方式的支持。我們可以通過編程或者配置的方式對消息編碼方式進(jìn)行顯式指定。在下面的代碼中,通過MessageEncoding屬性將編碼方式指定為:WSMessageEncoding.Mtom。

class Program
{
static void Main(string[] args)
{
BasicHttpBinding binding = new BasicHttpBinding();
binding.MessageEncoding = WSMessageEncoding.Mtom;
ListAllBindingElements(binding);
}
}

 

那么我們我們最終輸出的綁定元素列表中,TextMessageEncodingBindingElement將會被實現(xiàn)MTOM消息編碼的MtomMessageEncodingBindingElement代替。

1. System.ServiceModel.Channels.MtomMessageEncodingBindingElement
2. System.ServiceModel.Channels.HttpTransportBindingElement


BasicHttpBinding是WS-BP 1.1 Spec (Basic Profile) 標(biāo)準(zhǔn)的,ASP.NET ASMX Web Service的很多標(biāo)準(zhǔn)存在于WS-BP 1.1 Spec中,比如SOAP 1.1、WSDL 1.1、Message Security 1.0等等,所以BasicHttpBinding可以和傳統(tǒng)的ASP.NET ASMX Web Service進(jìn)行互操作。

2. WsHttpBinding

我們通過與BasicHttpBinding的方式來分析WsHttpBinding,先通過下面的方式列出在默認(rèn)條件下(通過默認(rèn)的構(gòu)造函數(shù)創(chuàng)建WsHttpBinding對象)該綁定對象具有的所有綁定元素:

class Program
{
static void Main(string[] args)
{
WsHttpBinding binding = new WsHttpBinding();
ListAllBindingElements(binding);
}
}

從下面的輸出來看,從上到下一共包含4個綁定元素:TransactionFlowBindingElement、SymmetricSecurityBindingElement、TextMessageEncodingBindingElement和HttpTransportBindingElement。TransactionFlowBindingElement實現(xiàn)了對事物流轉(zhuǎn);SymmetricSecurityBindingElement通過對稱加密的方式實現(xiàn)基于消息的安全;TextMessageEncodingBindingElement和HttpTransportBindingElement表明WsHttpBinding和BasicHttpBinding一樣采用基于文本的編碼方式和基于HTTP的傳輸協(xié)議。

1. System.ServiceModel.Channels.TransactionFlowBindingElement
2. System.ServiceModel.Channels.SymmetricSecurityBindingElement
3. System.ServiceModel.Channels.TextMessageEncodingBindingElement
4.System.ServiceModel.Channels.HttpTransportBindingElement


在這了需要特別指出的就是WsHttpBinding對事務(wù)的支持。對于SOA來說,事務(wù)永遠(yuǎn)是一個重要的主題,我們不僅僅需要單方的事務(wù)支持,比如將服務(wù)端的操作納入一個單一的事務(wù)之中,也需要事務(wù)的流轉(zhuǎn),將從客戶端開始的事務(wù)自動流向服務(wù)端;不僅僅需要基于單次服務(wù)調(diào)用的事務(wù),還需要基于多次服務(wù)訪問的事務(wù)(將多次服務(wù)調(diào)用納入同一個事務(wù)之中);不僅僅需要基于單一平臺的事務(wù)支持,還需要跨平臺的事務(wù)(比如將基于.NET平臺的WCF服務(wù)調(diào)用和基于J2EE平臺的Web服務(wù)調(diào)用納入同一個事務(wù)中)。在WS-*體系中,WS-T(Transactions)為事務(wù)定義了規(guī)范,而在WCF中,則通過TransactionFlowBindingElement實現(xiàn)了WS-Transactions規(guī)范。

WsHttpBinding在默認(rèn)的情況下就提供了對基于消息安全的支持,此外WsHttpBinding仍然提供基于HTTPS的傳輸安全。在下面我們對代碼稍加改動,通過構(gòu)造函數(shù)將WsHttpBinding設(shè)置為基于傳輸?shù)陌踩J剑?/p>

class Program
{
static void Main(string[] args)
{
WsHttpBinding binding = new WsHttpBinding(SecurityMode.Transport);
ListAllBindingElements(binding);
}
}

那么基于消息模式的SymmetricSecurityBindingElement將被去除,而作為傳輸綁定元素的HttpTransportBindingElement將被替換成HttpsTransportBindingElement,借此實現(xiàn)基于HTTPS的傳輸安全。

1. System.ServiceModel.Channels.TransactionFlowBindingElement
2. System.ServiceModel.Channels.TextMessageEncodingBindingElement
3.System.ServiceModel.Channels.HttpsTransportBindingElement

除了提供對傳輸和消息安全的支持之外,WsHttpBinding還對傳輸?shù)目煽啃蕴峁┲С帧?煽啃韵鬏敶_保在網(wǎng)絡(luò)環(huán)境不好的情況下消息的有效、有序抵達(dá)。WS-*通過WS-RM(Reliable Messaging)為可靠傳輸定義了規(guī)范,在WCF中WS-RM通過可靠會話(Reliable Session)實現(xiàn)了WS-RM,而WS-RM在WCF的實現(xiàn)通過ReliableSessionBindingElement承載。下面的代碼中,我們通過另一個構(gòu)造函數(shù)設(shè)定WsHttpBinding對可靠會話的支持(第二個參數(shù)代表是否支持可靠會話)。

class Program
{
static void Main(string[] args)
{
WSHttpBinding binding = new WSHttpBinding(SecurityMode.Message, true);
ListAllBindingElements(binding);
}
}

最終的輸出將包含五個綁定元素,第二個就是實現(xiàn)了可靠會話的ReliableSessionBindingElement。

1.System.ServiceModel.Channels.TransactionFlowBindingElement
2. System.ServiceModel.Channels.ReliableSessionBindingElement
3. System.ServiceModel.Channels.SymmetricSecurityBindingElement
4. System.ServiceModel.Channels.TextMessageEncodingBindingElement
5.System.ServiceModel.Channels.HttpTransportBindingElement

此外,和BasicHttpBinding一樣,WsHttpBinding定義了類型為System.ServiceModel.WSMessageEncoding枚舉類型的MessageEncoding屬性,有兩種WSMessageEncoding枚舉值供你選擇:Text和MTOM。

綜上所述,WsHttpBinding對大部分的WS-*提供支持,這包括我們上面提到的WS-Transactions、WS-Security、WS-Reliable Messaging等等。所以從互操作角度講,WsHttpBinding可以和滿足這些標(biāo)準(zhǔn)的Web Service進(jìn)行互操作。

3. WsDualHttpBinding

在前面對消息交換模式的介紹中,我們談到三種典型的消息交換模式:單向的數(shù)據(jù)報模式、請求/回復(fù)模式和雙工模式。WsDualHttpBinding就是專門為HTTP傳輸下雙工消息交換模式設(shè)計的。

除了基于傳輸?shù)陌踩猓琖sHttpbing的所有的特性都被WsDualHttpBinding繼承下來,這包括:基于HTTP的傳輸、基于文本和MTOM的消息編碼、WS-Security、WS-Transactions、WS-Reliable Messaging(Reliable Session)等等。我們?nèi)匀煌ㄟ^輸出綁定元素的方式證明這一點:

class Program
{
static void Main(string[] args)
{
WSDualHttpBinding binding = new WSDualHttpBinding();
ListAllBindingElements(binding);
}
}

下面列出了輸出的所有綁定元素,從中可以看出TransactionFlowBindingElement對WS-Transactions的支持;ReliableSessionBindingElement對WS-RM的支持;SymmetricSecurityBindingElement對WS-Security的支持;這些綁定元素和TextMessageEncodingBindingElement、HttpTransportBindingElement都是與WsHttpbing共有的,而CompositeDuplexBindingElement和OneWayBindingElement則是WsDualHttpBinding不具有的,這兩個綁定元素實現(xiàn)雙工通信和單項的數(shù)據(jù)報模式通信。

1. System.ServiceModel.Channels.TransactionFlowBindingElement
2. System.ServiceModel.Channels.ReliableSessionBindingElement
3. System.ServiceModel.Channels.SymmetricSecurityBindingElement
4. System.ServiceModel.Channels.CompositeDuplexBindingElement
5. System.ServiceModel.Channels.OneWayBindingElement
6. System.ServiceModel.Channels.TextMessageEncodingBindingElement
7. System.ServiceModel.Channels.HttpTransportBindingElement


對于WsHttpbing和WsDualHttpBinding的比較,還有一點值得注意的是在默認(rèn)情況下,WsHttpbing并沒有ReliableSessionBindingElement,也就是說在默認(rèn)的情況下,WsHttpbing并不支持可靠會話,而對于基于雙工通信的WsDualHttpBinding,可靠會話則是必須的。至于WsDualHttpBinding為何不支持基于傳輸?shù)陌踩蛞埠芎唵危驗镠TTP協(xié)議下的傳輸安全通過HTTPS(SSL)實現(xiàn),HTTPS依賴于一個真正意義上的Web站點,也就是只有訪問一個真正意義上Web站點的資源的前提下,HTTPS才會有有意義。而對于雙工通信來說,由于客戶端滿足這樣要求,所以從服務(wù)端回調(diào)客戶端的傳輸安全是無法確保的。

雙工通信需要一個雙工的通信通道,但是屬性TCP/IP的讀者應(yīng)該很清楚,HTTP協(xié)議僅僅是一個單純的請求/回復(fù)通信協(xié)議,也就是說基于HTTP的通信通道不可以支持雙工通信,那么WsDualHttpBinding又是如果在HTTP傳輸協(xié)議上實現(xiàn)雙工通信的呢?答案很簡單,WsDualHttpBinding采用了兩個HTTP通道。

4. NETTcpBinding

到此為止,我們一共介紹了三種類型的綁定。從對于傳輸協(xié)議的支持來看,它們都就是基于HTTP或者HTTPS的綁定;從對標(biāo)準(zhǔn)的支持看來,BasicHttpBinding提供對WS-BP 1.1的支持,WsHttpBinding和WsDualHttpBinding則對WS-*新的協(xié)議提供很好的支持,比如WS-Transactions、WS-Reliable Messaging、WS-Security等等;從消息編碼的角度來看,它們均支持基于純文本的消息編碼和MTOM編碼。這些屬性都決定了這三種綁定具有較好的互操作性,也就是說,對于此三種綁定的應(yīng)用并不限于對于基于.NET平臺應(yīng)用的交互,如果通過這些綁定寄宿我們的服務(wù),其他平臺的客戶端可以調(diào)用我們的服務(wù),同理我們也可以利用基于這些綁定的客戶端訪問其他非.NET平臺的Web服務(wù),只要對方支持相應(yīng)的標(biāo)準(zhǔn)。

接下來我們要介紹的另外三種綁定,相比之下就不具有如此好的互操作性,它們只能應(yīng)用于單純的WCF客戶端和服務(wù)之間的交互。它們基于不同的傳輸協(xié)議,我們先來介紹基于TCP傳輸協(xié)議的NETTcpBinding。

我們照例采用列出綁定元素列表的方式分析綁定的特性,我們先通過下面的代碼看看一個采用默認(rèn)構(gòu)造函數(shù)創(chuàng)建的NETTcpBinding對象會包含哪些綁丁元素。

class Program
{
static void Main(string[] args)
{
NETTcpBinding binding = new NETTcpBinding();
ListAllBindingElements(binding);
}
}

程序運(yùn)行后,下面4個綁定元素會被先后輸出。我們借來分析一個NETTcpBinding對象在默認(rèn)的情況下具有哪些特性:TcpTransportBindingElement表明采用TCP作為傳輸協(xié)議;WindowsStreamSecurityBindingElement提供基于Windows憑證的傳輸安全;BinaryMessageEncodingBindingElement實現(xiàn)基于二進(jìn)制的消息編碼;TransactionFlowBindingElement則提供對事務(wù)流轉(zhuǎn)的支持。

1. System.ServiceModel.Channels.TransactionFlowBindingElement
2. System.ServiceModel.Channels.BinaryMessageEncodingBindingElement
3. System.ServiceModel.Channels.SslStreamSecurityBindingElement
4. System.ServiceModel.Channels.TcpTransportBindingElement

上面涉及的四個綁定元素,除了WindowsStreamSecurityBindingElement,相信有了前面的介紹,讀者不會感到陌生。在這里我們來簡單討論一下WindowsStreamSecurityBindingElement。WindowsStreamSecurityBindingElement繼承自System.ServiceModel.Channels.StreamUpgradeBindingElement,StreamUpgradeBindingElement是一種特殊的綁定元素。前面我們講了,綁定元素的使命在于對相應(yīng)信道的創(chuàng)建,而StreamUpgradeBindingElement的特別之處在于它并會參與信道的創(chuàng)建。StreamUpgradeBindingElement一般應(yīng)用于基于流的傳輸(Stream Oriented Transport),比如TCP、命名管道等等。它一般位于TransportBindingElement之上,在傳輸層基礎(chǔ)上提供進(jìn)一步的升級處理(Transport Upgrade),比如安全加密、壓縮等等。WindowsStreamSecurityBindingElement在這里的提供基于Windows客戶端憑證的傳輸安全,與之相對的,還有一個System.ServiceModel.Channels.SslStreamSecurityBindingElement,提供基于SSL的傳輸安全。如果我們將綁定的客戶端憑證的類型改成Certificate或者None,SslStreamSecurityBindingElement將會被采用:

class Program
{
static void Main(string[] args)
{
NETTcpBinding binding = new NETTcpBinding();
binding.Security.Transport.ClientCredentialType = TcpClientCredentialType.Certificate;
ListAllBindingElements(binding);
}
}

WindowsStreamSecurityBindingElement將會被SslStreamSecurityBindingElement替換:

1. System.ServiceModel.Channels.TransactionFlowBindingElement
2. System.ServiceModel.Channels.BinaryMessageEncodingBindingElement
3. System.ServiceModel.Channels.SslStreamSecurityBindingElement
4. System.ServiceModel.Channels.TcpTransportBindingElement
 

除了對傳輸安全模式的支持(默認(rèn)),NETTcpBinding也提供對消息安全模式提供支持,比如下面的代碼中,再調(diào)用構(gòu)造函數(shù)的時候直接將安全模式類型指定為:SecurityMode.Message。

class Program
{
static void Main(string[] args)
{
NETTcpBinding binding = new NETTcpBinding(SecurityMode.Message);
ListAllBindingElements(binding);
}
}

實際上,如果采用消息安全模式,SymmetricSecurityBindingElement將會添加進(jìn)來實現(xiàn)基于消息級別的簽名、加密安全措施。這也可以從下面的輸出結(jié)果看出來:

1. System.ServiceModel.Channels.TransactionFlowBindingElement
2. System.ServiceModel.Channels.SymmetricSecurityBindingElement
3. System.ServiceModel.Channels.BinaryMessageEncodingBindingElement
4. System.ServiceModel.Channels.TcpTransportBindingElement


除了單純的傳輸安全模式和消息模式之外,NETTcpBinding還支持一種混合的安全模式,該模式的SecurityMode枚舉值表示為:SecurityMode.TransportWithMessageCredential。該模式通過傳輸安全保障數(shù)據(jù)的一致性和保密性,通過消息安全提供身份驗證。關(guān)于不同種類的安全模式,將在“安全”一章中進(jìn)行詳細(xì)講解。SslStreamSecurityBindingElement和TransportSecurityBindingElement一起提供該模式的安全,如下面的代碼所示:

class Program
{
static void Main(string[] args)
{
NETTcpBinding binding = new NETTcpBinding(SecurityMode.TransportWithMessageCredential);
ListAllBindingElements(binding);
}
}

輸出結(jié)果:

1. System.ServiceModel.Channels.TransactionFlowBindingElement
2. System.ServiceModel.Channels.TransportSecurityBindingElement
3. System.ServiceModel.Channels.BinaryMessageEncodingBindingElement
4. System.ServiceModel.Channels.SslStreamSecurityBindingElement
5. System.ServiceModel.Channels.TcpTransportBindingElement


和WsHttpBinding一樣,NETTcpBinding也提供對可靠會話的支持,以保障數(shù)據(jù)包或者消息的可靠、有序傳遞。不過與WsHttpBinding的實現(xiàn)機(jī)制不同的是,基于NETTcpBinding是采用TCP協(xié)議固有的可靠傳輸機(jī)制,比如消息確認(rèn)機(jī)制、重發(fā)機(jī)制等等。下面的代碼,通過ReliableSession.Enabled屬性讓綁定實現(xiàn)對可靠會話的支持:

class Program
{
static void Main(string[] args)
{
NETTcpBinding binding = new NETTcpBinding();
binding.ReliableSession.Enabled = true;
ListAllBindingElements(binding);
}
}

和WsHttpBinding一樣,通過ReliableSessionBindingElement實現(xiàn)對可靠會話的支持:

1. System.ServiceModel.Channels.TransactionFlowBindingElement
2. System.ServiceModel.Channels.ReliableSessionBindingElement
3. System.ServiceModel.Channels.BinaryMessageEncodingBindingElement
4. System.ServiceModel.Channels.WindowsStreamSecurityBindingElement
5. System.ServiceModel.Channels.TcpTransportBindingElement


由于NETTcpBinding采用TCP作為傳輸協(xié)議,所以它一般只應(yīng)用于IntraNET中;由于采用二進(jìn)制的消息編碼方式,在性能上較之基于文本的編碼會有較大的提高;此外,由于和HTTP協(xié)議不同,TCP本身就是一個基于雙工通信的協(xié)議,所以和WsDualBinding一樣可以用于基于雙工消息交換模式的WCF應(yīng)用中。

5. NETNamedPipeBinding

NETNamedPipeBinding,顧名思義,就是基于命名管道傳輸?shù)慕壎āC艿辣旧砜梢灾С挚鐧C(jī)器的通信,而在WCF中對NETNamedPipeBinding作了更加嚴(yán)格的限制,使其只能用于同一臺機(jī)器的跨進(jìn)程通信(IPC)。所以在所有的綁定中,NETNamedPipeBinding將是性能最好的綁定類型。

我們照例通過分析綁定元素的方式來理解綁定本身的特性與能力。先通過下面的代碼列出NETNamedPipeBinding默認(rèn)的綁定元素:

class Program
{
static void Main(string[] args)
{
NETNamedPipeBinding binding = new NETNamedPipeBinding();
ListAllBindingElements(binding);
}
}

從輸出的綁定元素集合,我們可以得出這樣的結(jié)論:NamedPipeTransportBindingElement實現(xiàn)了基于命名管道的傳輸;WindowsStreamSecurityBindingElement提供了基于Windows憑證的傳輸安全保障;BinaryMessageEncodingBindingElement實現(xiàn)了基于二進(jìn)制的消息編碼;而TransactionFlowBindingElement則為事務(wù)流轉(zhuǎn)提供支持。

1. System.ServiceModel.Channels.TransactionFlowBindingElement
2. System.ServiceModel.Channels.BinaryMessageEncodingBindingElement
3. System.ServiceModel.Channels.WindowsStreamSecurityBindingElement
4. System.ServiceModel.Channels.NamedPipeTransportBindingElement


由于NETNamedPipeBinding的特殊性(提供基于IPC的通信),所以決定了它的一些相關(guān)的特性:僅僅支持傳輸模式的安全(實際上消息安全模式在IPC場景下已經(jīng)沒有意義);客戶端憑證之限于Windows。我們可以將安全模式設(shè)為None,使其不采用任何安全模式:

class Program
{
static void Main(string[] args)
{
NETNamedPipeBinding binding = new NETNamedPipeBinding(NETNamedPipeSecurityMode.None);
ListAllBindingElements(binding);
}
}

這樣,WindowsStreamSecurityBindingElement將從綁定元素集合中剔除:

1. System.ServiceModel.Channels.TransactionFlowBindingElement
2. System.ServiceModel.Channels.BinaryMessageEncodingBindingElement
3. System.ServiceModel.Channels.NamedPipeTransportBindingElement


除了上述的五種綁定類型,WCF中還定義了其他一些綁定,比如NETMsmqBinding、MsmqIntegrationBinding、WebHttpBinding等等,將會在具體設(shè)計到這些特殊的綁定的章節(jié)中介紹。

WCF中的綁定模型:
[WCF中的Binding模型]之一: Binding模型簡介
[WCF中的Binding模型]之二: 信道與信道棧(Channel and Channel Stack)
[WCF中的Binding模型]之三:信道監(jiān)聽器(Channel Listener)
[WCF中的Binding模型]之四:信道工廠(Channel Factory)
[WCF中的Binding模型]之五:綁定元素(Binding Element)
[WCF中的Binding模型]之六:從綁定元素認(rèn)識系統(tǒng)預(yù)定義綁定

NET技術(shù)[WCF中的Binding模型]之六(完結(jié)篇):從綁定元素認(rèn)識系統(tǒng)預(yù)定義綁定,轉(zhuǎn)載需保留來源!

鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標(biāo)記有誤,請第一時間聯(lián)系我們修改或刪除,多謝。

主站蜘蛛池模板: 伊人网综合在线观看 | r18在线观看 | 青青草国产免费国产是公开 | 久久久精品2018免费观看 | 国产成人精品三级 | 日韩一区二区三区视频在线观看 | 亚洲黄色在线播放 | 欧美日韩国产超高清免费看片 | 国产色婷婷精品免费视频 | 四虎影视亚洲精品 | 国产99r视频精品免费观看 | 巨大巨粗巨长 黑人长吊视频 | 国产成人一区二区三区影院免费 | 久久精品成人国产午夜 | 视频一区二区三区在线 | 激情小说 激情图片 | 国产夫妻久久 | 久久99爰这里有精品国产 | 欧美激情一级欧美精品 | 曰本还a大片免费无播放器 曰本视频网络www色 | 亚洲二区在线播放 | 黄色美女视频网站 | 久久人人草 | 国产一区二区不卡 | 91第一页| 人人干免费 | 国产全黄三级国产全黄三级书 | 国产男女视频在线观看 | 国产精品亚洲综合色拍 | 天天拍夜夜添久久精品免费 | 污黄视频网站 | 国产高清美女一级a毛片久久 | 国产亚洲小视频 | 亚洲尹人香蕉网在线视颅 | 亚洲综合在线观看一区 | 一区二区三区在线视频观看 | 91久久国产精品 | 国产剧情乱偷 | 精品国产系列在线观看 | 色老板导航 | 福利视频专区 |