代碼分析WCF通道監聽器原理
隨著時代的發展,WCF是比較常用的技術之一,于是我研究了一下關于WCF通道監聽器,在這里拿出來和大家分享一下,希望對大家有用。之前我們也曾經講過通道和監聽器的關系。下面,我們再來回顧一下它們的關系。我們可以看到,ChannelListeners是非常有趣的家伙。在本例中,在程序中的每一個通道有一個ChannelListener。在這里我將指出每一個ChannelListener的差異。為了簡單起見,我們只看一下協議通道的ChannelListener。
首先,ChannelListener從 ChannelListenerBase類繼承。我們可以看到,泛型,作為.NET2.0框架的一個新特性,在WCF中被ChannelListener 和其它的類大量的使用。如果這些語法對于讀者很陌生,我們可以從這個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#從上面的代碼可以看出,在構造方法的第一個參數負責建立ChannelListener。我們將在后面的部分看到更多的BindingElement的內容。我們可能注意到ChannelListener所存儲的WCF通道監聽器只存在于通道棧的底層。我們將本文后面的內容學習到更多這方面的知識。前面講過,ChannelListener負責建立通道。在OnAcceptChannel事件發生時接收通道指令。在這個例子中,OnAcceptChannel方法被其中一個協議通道實現,WCF通道監聽器代碼如下:
- 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是一個在ChannelStack中比較底層的ChannelListener。這個ChannelListener保存了從當前監聽器的底層到上層的通道。這個保存被監聽器返回的通道的過程從底至一直延續到上層,然后,應用程序獲得了棧頂的一個引用。由于傳輸通道是最底層的通道,因此,在代碼中,傳輸通道簡單地建立了一個Message對象。GetProperty方法允許WCF的其他層使用通道棧。在本文的下面部分將討論GetProperty方法的使用。