WCF後傳系列(7):消息如何傳遞之綁定Part 2

概述

每個服務終結點都包含一個地址Address、一個綁定Binding 和一個契約Contract。契約指定可用的操作,綁定指定如何與服務進行通信,而地址指定查找服務的位置,在WCF專題系列前5篇中,深入瞭解了WCF中尋址的細節。本文爲消息如何傳遞之綁定第二部分,將詳細介紹WCF內置的各種綁定元素,綁定元素之間的順序以及如何創建一個自定義的綁定元素。
WCF專題系列(6):消息如何傳遞之綁定Part 1一文中,我提到綁定由綁定元素組成,每個綁定元素用來描述終結點與客戶端通信方式中的某個方面,在發送或接收消息時,每個綁定元素都表示一個處理步驟;運行時,綁定元素會創建必要的通道和偵聽器,用以生成傳出和傳入通道堆棧,其中三種主要的綁定元素是協議綁定元素,編碼綁定元素以及傳輸綁定元素,下面再對它們重新認識一下。

協議綁定元素

這些元素表示對消息執行的更高級別的處理步驟,如可靠性、安全性、事務等處理,由這些綁定元素創建的通道和偵聽器可以添加、移除或修改消息內容,以符合WS-*系列規範,給定的綁定可以具有0或多個協議綁定元素,WCF中內置的幾種協議綁定元素,其中包括:
1.ReliableSessionBindingElement:該綁定元素會在堆棧中提供一個可選層,該可選層可在終結點之間建立可靠會話並配置此會話的行爲。所謂的可靠性,是指SOAP消息可以在不可靠的網絡上(如HTTP)進行可靠的傳遞,保證消息無重複的、消息次序正確的進行交換,它的原理是:爲一組消息設定相同的ID,根據消息號將消息編組,並根據順序號進行排序,大家可以參考WS-Reliability和WS-ReliableMessaging協議。它的定義如下所示:
public sealed class ReliableSessionBindingElement
    : BindingElement, IPolicyExportExtension
{
    public bool Ordered { get; set; }
    public ReliableMessagingVersion ReliableMessagingVersion { get; set; }
    // 更多成員
}
WCF中內置的幾個綁定已經包含了ReliableSessionBindingElement,如果要添加該元素到其它綁定上,可以使用如下配置:
<bindings>
  <customBinding>
    <binding name="reliabilityhttp">
      <reliableSession/>
    </binding>
  </customBinding>
</bindings>
2.SecurityBindingElement:該綁定元素爲WCF中SOAP消息安全綁定元素的基類,它有三種具體的實現:支持對稱加密通道安全的SymmetricSecurityBindingElement、支持不對稱加密通道安全的AsymmetricSecurityBindingElement 和 支持混合模式通道安全的TransportSecurityBindingElement,如下圖所示:
TerryLee_WCF_21
這些實現爲在WS-Security Policy規範中定義的綁定建模,在創建自定義綁定中,我們需要提供SecurityBindingElement的某一個具體的實現,或者自定義一個類從SecurityBindingElement繼承。
3. TransactionFlowBindingElement:該綁定元素允許在終結點綁定設置中啓用或禁用傳入事務流,並允許指定傳入事務所需的協議格式。它的定義如下所示:
public sealed class TransactionFlowBindingElement
    : BindingElement, IPolicyExportExtension
{
    public TransactionProtocol TransactionProtocol { get; set; }
    // 更多成員
}
在補充的Web服務規範中,有一系列的關於事務處理的規範,如WS-AtomicTransactions、WS-Coordination等等。

編碼綁定元素

所謂的編碼是將消息轉換爲一個字節序列的過程,而解碼是相反的過程。編碼綁定元素表示消息與準備用於網絡傳輸的編碼之間的轉換,典型的WCF綁定正好包括一個編碼綁定元素。WCF內置的編碼綁定元素包括 MtomMessageEncodingBindingElement、BinaryMessageEncodingBindingElement 和 TextMessageEncodingBindingElement。 如果未對綁定指定編碼綁定元素,則使用默認的編碼。當傳輸協議是HTTP時,默認編碼爲文本,對於其他傳輸協議,默認編碼爲二進制。如下圖所示:
TerryLee_WCF_22
1. TextMessageEncodingBindingElement:表示文本方式編碼的XML消息編碼器,它的優點是互操作性最強,缺點是效率最低。WCF服務或者客戶端通常可以理解文本XML。但是,將大型二進制數據塊作爲文本傳輸不是有效的傳輸方式,它的定義如下所示:
public sealed class TextMessageEncodingBindingElement
    : MessageEncodingBindingElement, IWsdlExportExtension, IPolicyExportExtension
{
    public int MaxReadPoolSize { get; set; }
    public int MaxWritePoolSize { get; set; }
    public override MessageVersion MessageVersion { get; set; }
    public Encoding WriteEncoding { get; set; }
    public override MessageEncoderFactory CreateMessageEncoderFactory();
    // 更多成員
}
2.BinaryMessageEncodingBindingElement是指定在編碼消息時應該使用二進制XML格式的綁定元素,它包含用於指定要使用何種字符編碼以及SOAP消息與 WS-Addressing版本的選項。二進制編碼的優點是效率最高,缺點是互操作性最低,它的定義如下所示:
public sealed class BinaryMessageEncodingBindingElement
    : MessageEncodingBindingElement,
    IWsdlExportExtension, IPolicyExportExtension
{
    public int MaxReadPoolSize { get; set; }
    public int MaxSessionSize { get; set; }
    public int MaxWritePoolSize { get; set; }
    public override MessageVersion MessageVersion { get; set; }
    public override MessageEncoderFactory CreateMessageEncoderFactory();
    // 更多成員
}
3.MtomMessageEncodingBindingElement表示指定使用消息傳輸優化機制 (MTOM) 編碼的消息所用的字符編碼和消息版本管理以及其他設置的綁定元素。(MTOM) 是WCF消息中傳輸二進制數據的有效技術。MTOM 編碼器會嘗試在效率和互操作性之間建立平衡。MTOM 編碼以文本形式傳輸大多數 XML,但通過按原樣傳輸來優化大型二進制數據塊的傳輸,無需將其轉換爲base64編碼格式。它的定義如下所示:
public sealed class MtomMessageEncodingBindingElement
    : MessageEncodingBindingElement,
    IWsdlExportExtension, IPolicyExportExtension
{
    public int MaxBufferSize { get; set; }
    public int MaxReadPoolSize { get; set; }
    public int MaxWritePoolSize { get; set; }
    public override MessageVersion MessageVersion { get; set; }
    public Encoding WriteEncoding { get; set; }
    public override MessageEncoderFactory CreateMessageEncoderFactory();
    // 更多成員
}
如果以上編碼不能滿足實際的開發需求,我們還可以定義自己的消息編碼器,在後面的文章中,我將會詳細介紹。

傳輸綁定元素

這些元素表示傳輸協議上編碼消息的傳輸。典型的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");

自定義綁定元素

當在構造一個新的綁定時,如果系統內置的綁定元素無法滿足需要,可以開發一個自定義的綁定元素,如自定義的消息綁定元素、自定義的傳輸綁定元素或者任意一個綁定元素。關於消息綁定元素的自定義,我將在後面消息編碼器一文中進行介紹,而自定義傳輸綁定元素,也是一個相當負責工作,需要創建相應的自定義通道組件,所以將會放在介紹完WCF中通道模型之後再詳細講解。總的來說,實現一個自定義的綁定元素,需要繼承於抽象的基類BindingElement,如下面的代碼片段:
public class LoggingBindingElement : BindingElement
{
    public LoggingBindingElement()
    {
    }
    public LoggingBindingElement(LoggingBindingElement other)
        : base(other)
    {
    }
    public override BindingElement Clone()
    {
        return new LoggingBindingElement(this);
    }
    public override T GetProperty<T>(BindingContext context)
    {
        if (context == null)
        {
            throw new ArgumentNullException("context");
        }
        return context.GetInnerProperty<T>();
    }
}
在後面的文章將會看到一個完整的自定義綁定元素的例子。

總結

本文爲消息如何傳遞之綁定第二部分,詳細介紹了WCF內置的各種綁定元素,綁定元素之間的順序以及如何創建一個自定義的綁定元素。

0

收藏

lihuijun

203篇文章,65W+人氣,0粉絲

Ctrl+Enter 發佈

發佈

取消

掃一掃,領取大禮包

0

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