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

[WCF的Binding模型]之五:綁定元素(Binding Element)

在上面的內(nèi)容中,先后介紹了信道、信道管理器、信道監(jiān)聽器和信道工廠。從對(duì)象的創(chuàng)建來(lái)講,信道管理器是信道的創(chuàng)建者。說(shuō)的再具體點(diǎn),客戶端的信道通過(guò)信道工廠創(chuàng)建,服務(wù)端的信道通過(guò)信道監(jiān)聽器創(chuàng)建。但是信道工廠和信道監(jiān)聽器又是如果被創(chuàng)建出來(lái)的呢?

我們?cè)谝婚_始就已經(jīng)說(shuō)過(guò),作為終結(jié)點(diǎn)三要素的綁定對(duì)象實(shí)現(xiàn)了所有的通信細(xì)節(jié),并且通過(guò)創(chuàng)建信道棧實(shí)現(xiàn)了消息的傳遞。從這一點(diǎn)來(lái)說(shuō),綁定對(duì)象無(wú)疑是信道層所有通信對(duì)象的最終締造者,所以信道工廠和信道監(jiān)聽器最終的創(chuàng)建都是靠綁定對(duì)象實(shí)現(xiàn)的。關(guān)于這個(gè)創(chuàng)建過(guò)程又和另一個(gè)重要的對(duì)象密切相關(guān),那就是綁定元素。

1. 綁定元素(Binding Element)

綁定元素,顧名思義就是構(gòu)成一個(gè)綁定對(duì)象的元素。綁定對(duì)象最根本的目的就是創(chuàng)建信道棧,借此實(shí)現(xiàn)對(duì)消息的傳輸、編碼和基于消息交換的其他功能,比如安全、可靠傳輸、事務(wù)流轉(zhuǎn)等等。組成信道棧的單個(gè)信道對(duì)象基于對(duì)某項(xiàng)單一功能的實(shí)現(xiàn),在不同環(huán)境中,我們需要根據(jù)具體的需要?jiǎng)?chuàng)建相應(yīng)的信道,并根據(jù)一定的順序把這些信道組成一個(gè)完整的信道棧。對(duì)于綁定對(duì)象來(lái)說(shuō),如何實(shí)現(xiàn)這種靈活、自由的信道常創(chuàng)建方式,這得益于基于綁定元素的設(shè)計(jì)模式。

1.1. 關(guān)于綁定元素

從結(jié)構(gòu)的角度講,一個(gè)綁定對(duì)象有一系列綁定元素組成,每個(gè)綁定元素負(fù)責(zé)創(chuàng)建相應(yīng)的信道。所以綁定元素幾何的構(gòu)成以及它們之間的先后順序,決定了最終生成的信道棧中的信道組成已經(jīng)它們位于棧中的先后順序。WCF之所以在設(shè)計(jì)的時(shí)候?qū)⒔壎ê徒壎ㄔ胤蛛x開發(fā),是基于靈活性、可擴(kuò)展性考慮的。

在介紹信道和信道棧的時(shí)候我們說(shuō)過(guò),我們不可能、也不應(yīng)該創(chuàng)建一個(gè)萬(wàn)能的信道能夠提供消息交換中的所有的功能,所以我們讓一個(gè)信道只承載某個(gè)單一的功能,比如傳輸信道專注于網(wǎng)絡(luò)傳輸,消息編碼信到專注于消息的編碼,WCF還定義了一一系列的信道,他們分別關(guān)注與安全、可靠傳輸和事務(wù)流轉(zhuǎn)等等。這種信道組合的設(shè)計(jì)方式使得我們可以根據(jù)具體的需求來(lái)定制我們將要?jiǎng)?chuàng)建的信道棧,讓它只具有我們必須的功能,而去除不必要的功能。

同理,我們可以根據(jù)具體實(shí)際需求,將必要的綁定元素進(jìn)行有序的組合,從而創(chuàng)建最能適合具體場(chǎng)景的綁定對(duì)象。由于信道可以分為必須的傳輸信道、消息編碼信道和可選的基于某種WS-*協(xié)議實(shí)現(xiàn)的協(xié)議信道,與之相對(duì)地,我們的綁定元素可以分為傳輸綁定元素、消息編碼綁定元素和協(xié)議綁定元素。

由于信道的實(shí)際創(chuàng)建者是信道管理器(信道工廠和信道監(jiān)聽器),所以綁定元素只需要實(shí)現(xiàn)對(duì)信道管理器的創(chuàng)建,而最終實(shí)現(xiàn)對(duì)具體信道的創(chuàng)建。所以綁定元素的最根本的功能就是實(shí)現(xiàn)對(duì)信道監(jiān)聽器和信道工廠的創(chuàng)建。這可以從所有綁定元素的基類, System.ServiceModel.Channels.BindingElement的定義上看出來(lái):

public abstract class BindingElement{    // Methods    protected BindingElement();    protected BindingElement(BindingElement elementToBeCloned);    public virtual IChannelFactory BuildChannelFactory(BindingContext context);    public virtual IChannelListener BuildChannelListener(BindingContext context) where TChannel : class, IChannel;    public virtual bool CanBuildChannelFactory(BindingContext context);    public virtual bool CanBuildChannelListener(BindingContext context) where TChannel : class, IChannel;    public abstract BindingElement Clone();    public abstract T GetProperty(BindingContext context) where T : class;}

 

BindingElement的核心方法成員有兩個(gè):BuildChannelListener和BuildChannelFactory和CanBuildChannelListener

1.2. 案例演示:如何自定義綁定元素

接下來(lái),我們通過(guò)一個(gè)案例來(lái)演示如果自定義一個(gè)綁定元素。通過(guò)該綁定元素來(lái)創(chuàng)建我們?cè)谏厦嬉粋€(gè)案例中創(chuàng)建的兩個(gè)自定義信道管理器:SimpleChannelFactory和SimpleChannelListener。按照上面的命名方式,我們把這個(gè)自定義綁定元素命名為:SimpleBindingElement,下面是整個(gè)SimpleBindingElement的定義:

public class SimpleBindingElement : BindingElement{    public SimpleBindingElement()    {        PrintHelper.Print(this, "SimpleBindingElement");    }    public override BindingElement Clone()    {        PrintHelper.Print(this, "Clone");        return new SimpleBindingElement();    }    public override T GetProperty(BindingContext context)    {        PrintHelper.Print(this, string.Format("GetProperty<{0}>", typeof(T).Name));        return context.GetInnerProperty();    }    public override IChannelFactory BuildChannelFactory(BindingContext context)    {        PrintHelper.Print(this, "BuildChannelFactory");        return new SimpleChannelFactory(context) as IChannelFactory;    }    public override IChannelListener BuildChannelListener(BindingContext context)    {        PrintHelper.Print(this, "BuildChannelListener");        return new SimpleChannelListener(context) as IChannelListener;    }}

SimpleBindingElement直接繼承自抽象的基類BindingElement,對(duì)SimpleChannelFactory和SimpleChannelListener的創(chuàng)建分別實(shí)現(xiàn)在兩個(gè)被重寫的方法中:BuildChannelFactory和BuildChannelListener中。此外還重寫了兩個(gè)額外的方法:Clone和GetProperty,前者用于克隆一個(gè)新的綁定元素,后一個(gè)和定義在信道、信道管理器的同名方法一樣,用于獲取基于某種類型的屬性。

2. 綁定揭秘

前面我們一直在談?wù)撔诺馈⑿诺拦芾砥鳌⑿诺辣O(jiān)聽器、信道工廠和綁定元素,現(xiàn)在我們才進(jìn)體本章的主題。不過(guò)由于前面的鋪墊已經(jīng)很足了,綁定本身反而沒(méi)有太多可大書特書了。如果從結(jié)構(gòu)上給綁定下個(gè)定義,那么我的定義很簡(jiǎn)單:“綁定是綁定元素的有序集合”。

2.1. 綁定是綁定元素的有序集合

由于綁定的終極目標(biāo)是實(shí)現(xiàn)對(duì)信道棧的創(chuàng)建,而對(duì)于一個(gè)信道棧來(lái)說(shuō),信道的構(gòu)成和次序決定著該信道棧在最終消息通信中的特性與能力,而綁定元素有決定著信道的創(chuàng)建,所以綁定對(duì)象本身的特性與能力由構(gòu)成它的所有綁定元素以及這些綁定元素之間的先后次序決定。

正因?yàn)槿绱耍?dāng)我們需要判斷某一個(gè)綁定類型是否支持某種特性的時(shí)候,可以通過(guò)查看該綁定是否具有與此特性相關(guān)的綁定元素。比如,我們要判斷某種綁定是否支持某種類型的傳輸協(xié)議,只需要看看構(gòu)成該綁定的傳輸綁定元素就可以了,WsHttpBinding的傳輸綁定元素是HttpTransportBindingElement,所以 只能支持基于HTTP或者HTTPS的傳輸協(xié)議;如果需要確定某種類型的綁定是否支持事務(wù)的流轉(zhuǎn),只需要查看該綁定的綁定元素集合中是否包含TransactionFlowBindingElement就可以了。

在WCF中,所有的綁定都直接或者間接繼承自抽象基類:System.ServiceModel.Channels.Binding,我們現(xiàn)在來(lái)簡(jiǎn)單地分析一下這個(gè)基類。Binding實(shí)現(xiàn)了接口IDefaultCommunicationTimeouts。

public abstract class Binding : IDefaultCommunicationTimeouts{    public TimeSpan OpenTimeout { get; set; }     public TimeSpan CloseTimeout { get; set; }        public TimeSpan SendTimeout { get; set; }    public TimeSpan ReceiveTimeout { get; set; }} 

 

四個(gè)默認(rèn)的超時(shí)時(shí)限可以通過(guò)編程的方式顯式指定,也可以通過(guò)配置的方式進(jìn)行設(shè)置。他們的默認(rèn)值分別為:OpenTimeout和CloseTimeout為1分鐘,而SendTimeout和ReceiveTimeout為10分鐘。

對(duì)于Binding,最為重要的就是如果構(gòu)建組成該綁定對(duì)象的所有綁定元素集合。基于綁定元素的創(chuàng)建,通過(guò)抽象方法CreateBindingElements實(shí)現(xiàn),所有具體的綁定類型均需要實(shí)現(xiàn)該方法。

public abstract class Binding : IDefaultCommunicationTimeouts{       ... ...    public abstract BindingElementCollection CreateBindingElements();  }

由于信道管理器棧創(chuàng)建相應(yīng)的信道棧,而綁定創(chuàng)建信道管理器棧,因此在Binding中定義了一系列BuildChannelFactory和BuildChannelListener方法重載,用于創(chuàng)建信道工廠棧和信道監(jiān)聽器棧。此外,和BindingElement一樣,CanBuildChannelFactory和CanBuildChannelListener用于檢測(cè)綁定對(duì)象創(chuàng)建信道工廠和信道監(jiān)聽器的能力:

public abstract class Binding: IDefaultCommunicationTimeouts{    ...    public IChannelFactory BuildChannelFactory(params object[] parameters);    public virtual IChannelFactory BuildChannelFactory(BindingParameterCollection parameters);    public virtual IChannelListener BuildChannelListener(params object[] parameters) where TChannel : class, IChannel;    public virtual IChannelListener BuildChannelListener(BindingParameterCollection parameters) where TChannel : class, IChannel;    public virtual IChannelListener BuildChannelListener(Uri listenUriBaseAddress, params object[] parameters) where TChannel : class, IChannel;    public virtual IChannelListener BuildChannelListener(Uri listenUriBaseAddress, BindingParameterCollection parameters) where TChannel : class, IChannel;    public virtual IChannelListener BuildChannelListener(Uri listenUriBaseAddress, string listenUriRelativeAddress, params object[] parameters) where TChannel : class, IChannel;    public virtual IChannelListener BuildChannelListener(Uri listenUriBaseAddress, string listenUriRelativeAddress, BindingParameterCollection parameters) where TChannel : class, IChannel;    public virtual IChannelListener BuildChannelListener(Uri listenUriBaseAddress, string listenUriRelativeAddress, ListenUriMode listenUriMode, params object[] parameters) where TChannel : class, IChannel;    public virtual IChannelListener BuildChannelListener(Uri listenUriBaseAddress, string listenUriRelativeAddress, ListenUriMode listenUriMode, BindingParameterCollection parameters) where TChannel : class, IChannel;    public virtual bool CanBuildChannelFactory(BindingParameterCollection parameters);    public bool CanBuildChannelFactory(params object[] parameters);    public bool CanBuildChannelListener(params object[] parameters) where TChannel : class, IChannel;    public virtual bool CanBuildChannelListener(BindingParameterCollection parameters) where TChannel : class, IChannel;}

2.2. 案例演示:如何創(chuàng)建自定義綁定

在上一個(gè)案例演示中,我們創(chuàng)建了自定義的綁定元素:SimpleBindingElement,在案例中我們來(lái)真正使用綁定元素,為此我們創(chuàng)建一個(gè)直接繼承自Binding的自定義綁定。為了簡(jiǎn)單起見(jiàn),對(duì)于我們自定義的綁定,他僅僅包含三個(gè)必須的綁定元素:傳輸綁定元素和消息編碼綁定元素,外加我們自定義的綁定元素。對(duì)于傳輸,我們采用基于HTTP協(xié)議的HttpTransportBindingElement,而對(duì)應(yīng)消息編碼,則采用基于文本編碼方式的TextMessageEncodingBindingElement。我們索性將我們自定義的綁定命名為SimpleBinding,下面是SimpleBinding的定義:

namespace Artech.CustomChannels{    public class SimpleBinding : Binding    {        private string _scheme;        private TransportBindingElement _transportBindingElement = new HttpTransportBindingElement();        private MessageEncodingBindingElement _messageEncodingBindingElement = new TextMessageEncodingBindingElement();        private SimpleBindingElement _SimpleBindingElement = new SimpleBindingElement();        public override BindingElementCollection CreateBindingElements()        {            BindingElementCollection elemens = new BindingElementCollection();            elemens.Add(this._SimpleBindingElement);            elemens.Add(this._messageEncodingBindingElement);            elemens.Add(this._transportBindingElement);            return elemens.Clone();        }        public override string Scheme        {            get            {                return this._transportBindingElement.Scheme;            }        }    }}

對(duì)于整個(gè)SimpleBinding的定義,從形式上看顯得異常的簡(jiǎn)單,僅僅是實(shí)現(xiàn)了定義在Binding中的抽象方法CreateBindingElements。在CreateBindingElements方法中,返回一個(gè)表示綁定元素集合的BindingElementCollection對(duì)象,在該集合中,包含三種類型的綁定元素,有上到下的順序分別為:SimpleBindingElement、MessageEncodingBindingElement和HttpTransportBindingElement。此外重寫了Scheme只讀屬性,它返回HttpTransportBindingElement的scheme:http。

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

NET技術(shù)[WCF的Binding模型]之五:綁定元素(Binding Element),轉(zhuǎn)載需保留來(lái)源!

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

主站蜘蛛池模板: 大尺度毛片 | 手机成人在线视频 | 久久久中文字幕日本 | 六月婷婷激情综合 | 国内精品一区二区2021在线 | 亚洲人成人网毛片在线播放 | 91精品国产综合久久久久久 | 亚洲欧洲精品成人久久曰影片 | 婷婷六| 黄视频在线 | 图片专区亚洲 欧美 另类 | 久久精品国产亚洲a不卡 | 久久成年片色大黄全免费网站 | 国产小视频在线观看免费 | 巨人导航收录500精品 | 激情综合丝袜美女一区二区 | 97豆奶| 色呦呦免费| 国产最新精品视频 | 激情综合网五月激情 | 2019天天干天天操 | 狠狠久久综合 | 国产第一页亚洲 | 亚洲国产精品久久久久网站 | 国产精品手机在线亚洲 | 黄色在线观看视频 | 亚洲精品在线播放 | 色www精品视频在线观看 | 狠狠色伊人亚洲综合网站l 狠狠色伊人亚洲综合网站色 | 国产精品九九免费视频 | 成人sq视频在线观看网站 | 国产精品久久久久亚洲 | 欧美一区二区三区gg高清影视 | 91在线一区二区 | 国产精品伦理久久久久 | 亚洲国产人成在线观看 | 久久国产成人精品国产成人亚洲 | 在线a亚洲视频播放在线观看 | 国产一区二区视频在线观看 | 41sao.can在线观看国产 | 丁香六月综合 |