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內置的各類綁定元素,綁定元素之間的順序以及如何建立一個自定義的綁定元素。

0javascript

收藏css

lihuijun

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

Ctrl+Enter 發佈html

發佈java

取消jquery

掃一掃,領取大禮包git

0面試

分享
lihuijun
相關文章
相關標籤/搜索