代碼分析WCF通道監(jiān)聽器原理
隨著時(shí)代的發(fā)展,WCF是比較常用的技術(shù)之一,于是我研究了一下關(guān)于WCF通道監(jiān)聽器,在這里拿出來和大家分享一下,希望對大家有用。之前我們也曾經(jīng)講過通道和監(jiān)聽器的關(guān)系。下面,我們再來回顧一下它們的關(guān)系。我們可以看到,ChannelListeners是非常有趣的家伙。在本例中,在程序中的每一個(gè)通道有一個(gè)ChannelListener。在這里我將指出每一個(gè)ChannelListener的差異。為了簡單起見,我們只看一下協(xié)議通道的ChannelListener。
首先,ChannelListener從 ChannelListenerBase類繼承。我們可以看到,泛型,作為.NET2.0框架的一個(gè)新特性,在WCF中被ChannelListener 和其它的類大量的使用。如果這些語法對于讀者很陌生,我們可以從這個(gè)URL中獲得有用的信息:http://msdn2.microsoft.com/en-us/library/ms379564(VS.80).aspx。下面是ChannelListener類的聲明:
- class TestTransportChannelListener : ChannelListenerBase<IInputChannel>
- { private Uri _uri; private EndpointAddress _localAddress;
- public TestTransportChannelListener(TestTransportBindingElement transportElement, BindingContext context) :
- base(context.Binding) { BigHelper.DisplayMessage("Construct " + this.ToString());
- _uri = new Uri(context.ListenUriBaseAddress, context.ListenUriRelativeAddress);
- _localAddress = transportElement.LocalAddress; }
#T#從上面的代碼可以看出,在構(gòu)造方法的第一個(gè)參數(shù)負(fù)責(zé)建立ChannelListener。我們將在后面的部分看到更多的BindingElement的內(nèi)容。我們可能注意到ChannelListener所存儲的WCF通道監(jiān)聽器只存在于通道棧的底層。我們將本文后面的內(nèi)容學(xué)習(xí)到更多這方面的知識。前面講過,ChannelListener負(fù)責(zé)建立通道。在OnAcceptChannel事件發(fā)生時(shí)接收通道指令。在這個(gè)例子中,OnAcceptChannel方法被其中一個(gè)協(xié)議通道實(shí)現(xiàn),WCF通道監(jiān)聽器代碼如下:
- protected override IInputChannel OnAcceptChannel(TimeSpan timeout)
- {
- EndpointAddress address = new EndpointAddress(BigHelper.Uri);
- _innerChannel = _innerChannelListener.AcceptChannel(timeout);
- TestLevel2Channel channel = new TestLevel2Channel(this, address);
- return channel;
- }
在上面的OnAcceptChannel中可以看出,_innerChannelListener是一個(gè)在ChannelStack中比較底層的ChannelListener。這個(gè)ChannelListener保存了從當(dāng)前監(jiān)聽器的底層到上層的通道。這個(gè)保存被監(jiān)聽器返回的通道的過程從底至一直延續(xù)到上層,然后,應(yīng)用程序獲得了棧頂?shù)囊粋€(gè)引用。由于傳輸通道是最底層的通道,因此,在代碼中,傳輸通道簡單地建立了一個(gè)Message對象。GetProperty方法允許WCF的其他層使用通道棧。在本文的下面部分將討論GetProperty方法的使用。