WCF綁定

綁定的基本概念:

通道模型具有極大的靈活性,可以在協議通道,編碼器,傳輸通道等各個方面進行設置,每次都需要設置一個完整的通道棧是一個較爲複雜的事情,從傳輸協議上看,有HTTP,TCP,UDP,P2P,IPC和MSMQ等多種方案,從編碼器上,有二進制編碼,MTOM等編碼方法,在加上消息的安全策略,會話設置的組合會有很多。綁定是一個定製好的通道棧,包含協議通道,傳輸通道和編碼器,從功能上看,一個綁定集成了通信模式,可靠性,安全性,事務傳播和互操作性等設置,標準綁定一共有十二種,

WCF 附帶有以下綁定。

 

綁定

配置元素

說明

BasicHttpBinding

<basicHttpBinding>

一個綁定,適用於與符合 WS-Basic Profile 的 Web 服務(例如基於 ASP.NET Web 服務 (ASMX) 的服務)進行的通信。此綁定使用 HTTP 作爲傳輸協議,並使用文本/XML 作爲默認的消息編碼。

WSHttpBinding

<wsHttpBinding>

一個安全且可互操作的綁定,適合於非雙工服務約定。

WSDualHttpBinding

<wsDualHttpBinding>

一個安全且可互操作的綁定,適用於雙工服務協定或通過 SOAP 媒介進行的通信。

WSFederationHttpBinding

<wsFederationHttpBinding>

一個支持 WS-Federation 協議的安全的、可互操作的綁定,使聯盟中的組織可以高效地對用戶進行身份驗證和授權。

NetTcpBinding

<netTcpBinding>

一個安全且經過優化的綁定,適用於 WCF 應用程序之間跨計算機的通信。

NetNamedPipeBinding

<netNamedPipeBinding>

一個安全、可靠且經過優化的綁定,適用於 WCF 應用程序之間計算機上的通信。

NetMsmqBinding

<netMsmqBinding>

一個排隊綁定,適用於 WCF 應用程序之間的跨計算機的通信。

NetPeerTcpBinding

<netPeerTcpBinding>

一個支持多計算機安全通信的綁定。

MsmqIntegrationBinding

<msmqIntegrationBinding>

一個適合於 WCF 應用程序和現有消息隊列應用程序之間的跨計算機通信的綁定。

BasicHttpContextBinding

<basicHttpContextBinding>

一個綁定,適用於與符合 WS-Basic Profile 且允許使用 HTTP Cookie 交換上下文的 Web 服務進行的通信。

NetTcpContextBinding

<netTcpContextBinding>

一個安全且經過優化的綁定,適用於允許使用 SOAP 標頭交換上下文的 WCF 應用程序之間跨計算機的通信。

WebHttpBinding

<webHttpBinding>

一個綁定,可用於爲通過 HTTP 請求(而不是 SOAP 消息)公開的 WCF Web 服務配置終結點。

WSHttpContextBinding

<wsHttpContextBinding>

一個安全且可互操作的綁定,適用於允許使用 SOAP 標頭交換上下文的非雙工服務協定。

 

源文檔 <http://msdn.microsoft.com/zh-cn/library/ms730879(v=VS.90).aspx>

 

綁定

互操作性

安全性(默認)

會話 (默認)

事務

雙工

編碼(默認)

流 (默認)

BasicHttpBinding

Basic Profile 1.1

(無)、傳輸、消息、混合

(無)

(無)

n/a

文本、(MTOM)

(緩衝式)

WSHttpBinding

WS

傳輸、(消息)、混合

(無)、可靠會話、安全會話

(無)、是

n/a

(文本)、MTOM

WSDualHttpBinding

WS

(消息)、無

(可靠會話)、安全會話

(無)、是

(文本)、MTOM

WSFederationHttpBinding

WS-Federation

(消息)、混合、無

(無)、可靠會話、安全會話

(無)、是

(文本)、MTOM

NetTcpBinding

.NET

(傳輸)、消息、無、混合

(傳輸)、可靠會話、安全會話

(無)、是

二進制

(緩衝式)

NetNamedPipeBinding

.NET

(傳輸)、無

無、(傳輸)

(無)、是

二進制

(緩衝式)

NetMsmqBinding

.NET

消息、(傳輸)、無

(無)、傳輸

無、(是)

二進制

NetPeerTcpBinding

對等

(傳輸)

(無)

(無)

 

MsmqIntegrationBinding

MSMQ

(傳輸)

(無)

無、(是)

n/a

n/a

BasicHttpContextBinding

基本配置文件 1.1

(無)、傳輸、消息、混合

(無)

(無)

n/a

文本、(MTOM)

(緩衝式)

NetTcpContextBinding

.NET

(傳輸)、消息、無、混合

(傳輸)、可靠會話、安全會話

(無)、是

二進制

(緩衝式)

WSHttpContextBinding

WS

傳輸、(消息)、混合

(無)、可靠會話、安全會話

(無)、是

n/a

文本、(MTOM)

性能上考慮:

 

使用IPC的綁定性能要優於使用TCP的綁定,使用TCP 的綁定要由於HTTP。

WCF-WCF的交互可以分爲下列幾種情況1)跨越主機進程交互,2)快越應用程序但在統一進程內交互,3)在統一應用程序域內交互。

IPC基本概念

IPC是一種通信方法,而非通信協議。全稱是進程間通信,在WIN32系統中,主要利用以下幾種方法實現:

1.使用剪貼板,剪貼板可以在進程之間共享,並且這種機制容易理解,使用也方便,缺點是使用非常頻繁,容易產生資源爭用,同時性能不高。

2. 使用匿名管道和命名管道,管道是進程用來通信的共享內存區域,一個進程相管道重寫入信息,而其他的進程可以從管道中讀出信息,管道是進程之間交流的通道,管道的類型有兩種, 匿名管道和命名管道,匿名管道是不命名的,他最初用於在本地系統中父進程與他啓動的子進程之間的通信,命名管道更高級,它有一個名字表示,以示客戶段和服務端應用程序可以通過它進行彼此通信,而且,WIN32 管道甚至可以在不同系統進程間使用。軟件是連接兩個進程並傳輸數據,一個管道一旦被建立,她就可以向文件一樣被訪問,並且可以使用許多與文件操作同樣的函數,可以使用CreateFile函數獲取一個以打開的管道句柄,或者由另一個進程提供一個句柄,使用WriteFile函數向管道寫入數據,之後這些數據可以被另外進程使用ReadFile函數讀取,管道是系統對象,因此管道句柄不需要時必須使用CloseHandler函數關閉,

3.匿名管道只能單向傳送數據,而命名管道可以實現雙向傳送數據,管道可以比特流形式傳送數據,命名管道可以將數據機和到成爲消息的數據塊中,命名管道甚至具有通過網絡連接多個進程的能力。

4.使用郵件槽,廣播式通信,在Win32系統中提供的新方法,可以在不同的主機間交換數據,實現了網絡跨越.

5.使用TCP/IP他具備消息管道的所有功能,但遵守一套通信標準是的不同操作系統之上的應用程序可以互相通信,這種方式用於網絡方面比較好,用於本地進程間交互性能較差。

6. 使用COM/DCOM:通過COM系統代理存根方式進行進程間數據交換,但只能夠表現在對接口含糊調用時傳遞數據,通過DCOM可以在不同的主機間傳送數據。

7.使用內存影射文件:系統內核內存區域開闢一塊內存,然後每個進程把每個內存映射到自己可以訪問的虛內存地址中,對每個進程說,似乎在操作系統的格子的內存區域,而實際上所有的操作被映射到內存區域中

跨主機的WCF-WCF交互的綁定的地址

當服務器部署在不同的服務器上,對於局域網內跨主機的WCF-WCF交互,採用TCP協議進行通信是較爲合適的選擇,首先TCP是先面連接的通信協議,其次處於傳輸層,TCP一般被稱爲是一種端對端的協議,當一臺計算機需要與另一臺計算機建立連接時,TCP協議會讓他們建立一個連接,發送和接收資料以及終止連接,傳輸控制協議TCP協議利用重發技術和擁塞控制機制,嚮應用程序提供可靠的通信連接,使他能夠自動適應網上的各種變化。IP協議之保證計算機能夠發送和接收分組資料,而TCP協議則可以提供一個可靠的,可流控制的,全雙工的信息傳輸服務。

 

TCP/IP 通過一個應用程序協議分配一個唯一的16位斷口號,從而使用斷口號來區分應用程序,例如HTTP通信現在已經統一爲使用TCP端口80 ,SMTP使用TCP端口25,FTP 使用TCP端口20和21 ,其他使用TCP傳輸協議的應用程序可以按習慣活遵循標準選擇其他可用的斷口號,防火牆一般會配置阻塞TCP通信,部署使用非標準端口的應用程序進程會因爲存在公司防火牆和個人防火牆而變得複雜甚至無法實現,通過已得到允許標準的端口進行通信的應用程序可以較少外部攻擊,TCP默認端口爲80 ,在HTTP。SYS模型中,許多不同的HTTP應用程序的通信中將多路複用到單個TCP端口,此模型以及稱爲Window平臺上的標準,這可以降低部署程序的成本。但是多個HTTP應用程序共享端口的能力早已成爲Internet信息服務的一個功能,但是,只有在引入IIS6.0附帶的協議之後,此基礎結構才完全得到廣泛使用,實際上,Http.Sys允許任意進程共享專用於HTTP通信的TCP端口,此功能可以讓HTTP應用程序在統一物理計算機上共存於不同的進程中,同時共享80端口發送和接收所需要的網絡基礎結構。

使用netTcpBinding 是唯一能夠使用TCP協議的使用二進制編碼來提高性能

 

WebService是一種網絡服務,通過通用的規範,WebService技術須臾使用者訪問網絡上每一個WebService提供的服務.Web服務的消息都是基於Soap協議進行的, 而Soap本身又處於Http/Https協議之上,所以Soap協議可以輕鬆地穿越防火牆,而同時藉助XML的跨平臺特性, Soap協議和具體的實現平臺完全無關,Soap協議是簡單對象訪問協議的縮寫,它致以與提供一個簡單,輕量的用於在分散或分佈環境中交換結構化和類型信息的機制,它致規範對消訪問的方式,而不限制具體實現的技術環境,這意味着Soap協議是一種跨技術平臺的協議,它一般由四部分組成:Soap信封,Soap編碼規則,Soap RPc,Soap 綁定。

服務端綁定:

  1. <?xml version="1.0" encoding="utf-8" ?>
    <configuration>
     
    <system.serviceModel>
        <services>
          <service name=" CalculatorService" >
            <endpoint
            <-- Leave the address blank to be populated by default-->
            <--from the hosting environment,in this case IIS, so -->
            <-- the address will just be that of the IIS Virtual -->
            <--Directory.-->
                address=""
            <--Specify the binding type -->
                binding="wsHttpBinding"
            <--Specify the binding configuration name for that -->
            <--binding type. This is optional but useful if you  -->
            <--want to modify the properties of the binding. -->
            <--The bindingConfiguration name Binding1 is defined  -->
            <--below in the bindings element.  -->
                bindingConfiguration="Binding1"
                contract="ICalculator" />
          </service>
        </services>
        <bindings>
          <wsHttpBinding>
            <binding name="Binding1">
              <-- Binding property values can be modified here. -->
              <--See the next procedure. -->
            </binding>
          </wsHttpBinding>
       </bindings>
      </system.serviceModel>
    </configuration>

自定義綁定:

WCF中內置的幾種協議綁定元素,其中包括:

ReliableSessionBindingElement:該綁定元素會在堆棧中提供一個可選層,該可選層可在終結點之間建立可靠會話並配置此會話的行爲。所謂的可靠性,是指SOAP消息可以在不可靠的網絡上(如HTTP)進行可靠的傳遞,保證消息無重複的、消息次序正確的進行交換,它的原理是:爲一組消息設定相同的ID,根據消息號將消息編組,並根據順序號進行排序,

SecurityBindingElement:該綁定元素爲WCF中SOAP消息安全綁定元素的基類,它有三種具體的實現:支持對稱加密通道安全的SymmetricSecurityBindingElement、支持不對稱加密通道安全的AsymmetricSecurityBindingElement 和 支持混合模式通道安全的TransportSecurityBindingElement

TransactionFlowBindingElement:該綁定元素允許在終結點綁定設置中啓用或禁用傳入事務流,並允許指定傳入事務所需的協議格式。
編碼綁定元素

所謂的編碼是將消息轉換爲一個字節序列的過程,而解碼是相反的過程。編碼綁定元素表示消息與準備用於網絡傳輸的編碼之間的轉換,典型的WCF綁定正好包括一個編碼綁定元素。WCF內置的編碼綁定元素包括 MtomMessageEncodingBindingElement、BinaryMessageEncodingBindingElement 和 TextMessageEncodingBindingElement。 如果未對綁定指定編碼綁定元素,則使用默認的編碼。當傳輸協議是HTTP時,默認編碼爲文本,對於其他傳輸協議,默認編碼爲二進制。

TextMessageEncodingBindingElement:表示文本方式編碼的XML消息編碼器,它的優點是互操作性最強,缺點是效率最低。WCF服務或者客戶端通常可以理解文本XML。但是,將大型二進制數據塊作爲文本傳輸不是有效的傳輸方式

BinaryMessageEncodingBindingElement:是指定在編碼消息時應該使用二進制XML格式的綁定元素,它包含用於指定要使用何種字符編碼以及SOAP消息與 WS-Addressing版本的選項。二進制編碼的優點是效率最高,缺點是互操作性最低,

MtomMessageEncodingBindingElement表示指定使用消息傳輸優化機制 (MTOM) 編碼的消息所用的字符編碼和消息版本管理以及其他設置的綁定元素。(MTOM) WCF消息中傳輸二進制數據的有效技術。MTOM 編碼器會嘗試在效率和互操作性之間建立平衡。MTOM 編碼以文本形式傳輸大多數 XML,但通過按原樣傳輸來優化大型二進制數據塊的傳輸,無需將其轉換爲base64編碼格式
傳輸綁定元素

這些元素表示傳輸協議上編碼消息的傳輸。典型的WCF綁定正好包括一個從 TransportBindingElement 繼承的傳輸綁定元素。WCF中內置的傳輸綁定元素有如下幾種:

TcpTransportBindingElement
HttpTransportBindingElement
HttpsTransportBindingElement
NamedPipeTransportBindingElement
PeerTransportBindingElement
MsmqTransportBindingElement
MsmqIntegrationBindingElement
ConnectionOrientedTransportBindingElement


綁定元素順序

在創建綁定時,向綁定中添加綁定元素的順序非常重要,必須按照如下順序進行:

1.最頂層是一個允許流事務的TransactionFlowBindingElement元素,可選;

2.接下來是一個可靠性支持的ReliableSessionBindingElement元素,可選;

3.接下來是一個安全性支持的SecurityBindingElement元素,可選;

4.在接下來是消息編碼綁定元素,可以是系統內置的三種消息編碼器之一或者自定義的消息編碼器,必須具有,但是如果不添加,系統會根據傳輸不同默認添加一個消息編碼器;

5.最底層是一個傳輸綁定元素,可以是系統內置的幾種傳輸綁定元素之一或者自定義的傳輸綁定元素。

6.如果是自定義的綁定元素,根據綁定元素的功能可以放在以上幾層任意層之間

代碼:

// 可靠性支持
ReliableSessionBindingElement reliable =
   
new ReliableSessionBindingElement();
reliable.Ordered =
false;

// 編碼元素
TextMessageEncodingBindingElement text =
   
new TextMessageEncodingBindingElement();
text.MessageVersion =
MessageVersion.Soap11WSAddressingAugust2004;

// 傳輸元素
HttpTransportBindingElement http = new HttpTransportBindingElement();
http.TransferMode =
TransferMode.Streamed;
http.UseDefaultWebProxy =
true;

// 自定義綁定
CustomBinding httpBinding = new CustomBinding();
httpBinding.Name =
"httpBinding";
httpBinding.Elements.Add(reliable);
httpBinding.Elements.Add(text);
httpBinding.Elements.Add(http);

host.AddServiceEndpoint(
typeof(ICalculator), httpBinding,
   
"http://localhost:8887/Calculator");

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章