WCF技术黑幕 第6章(6)
WCF技术内幕 第6章(6)
数据报发送通道
6.6 创建自定义通道
创建基类型
//Create base class using System; using System.ServiceModel.Channels; namespace WCFChannelSample { class DelegatorChannelBase<TShape> : ChannelBase where TShape : class, IChannel { private TShape _innerChannel; //引用堆栈中的下一个通道 private string _source; //打印的字符 protected TShape InnerChannel { get { return _innerChannel; } } //提供_innerChannel给继承类型 protected DelegatorChannelBase(ChannelManagerBase channelManagerBase, TShape innerChannel, string source) : base(channelManagerBase) { if (innerChannel == null) throw new ArgumentNullException("DelegatorChannelBase requires a non-null channel.", "innerChannel"); _source = string.Format("{0} CHANNEL STATE CHANGE: DelegatorChannelBase", source); _innerChannel = innerChannel; } //IChannel实现 public override T GetProperty<T>() { return this.InnerChannel.GetProperty<T>(); } #region CommunicationObject Members protected override void OnAbort() { Console.WriteLine("Abort:" + _source); this.InnerChannel.Abort(); } protected override IAsyncResult OnBeginClose(TimeSpan timeout, AsyncCallback callback, object state) { Console.WriteLine("BeginClose:" + _source); return this.InnerChannel.BeginClose(timeout, callback, state); } protected override IAsyncResult OnBeginOpen(TimeSpan timeout, AsyncCallback callback, object state) { Console.WriteLine("BeginOpen:" + _source); return this.InnerChannel.BeginOpen(timeout, callback, state); } protected override void OnClose(TimeSpan timeout) { Console.WriteLine("Close:" + _source); this.InnerChannel.Close(timeout); } protected override void OnEndClose(IAsyncResult result) { Console.WriteLine("EndClose:" + _source); this.InnerChannel.EndClose(result); } protected override void OnEndOpen(IAsyncResult result) { Console.WriteLine("EndOpen:" + _source); this.InnerChannel.EndOpen(result); } protected override void OnOpen(TimeSpan timeout) { Console.WriteLine("Open:" + _source); this.InnerChannel.Open(timeout); } #endregion } }
数据报发送通道
//数据报发送通道 using System.ServiceModel.Channels; namespace WCFChannelSample { class DelegatorInputChannel<TShape> : DelegatorChannelBase<TShape>, IInputChannel where TShape : class, IInputChannel { internal DelegatorInputChannel(ChannelManagerBase channelManagerBase, TShape innerChannel, string source) : base(channelManagerBase, innerChannel, source) { } ... } }
数据报接收会话通道
//数据报接收会话通道 using System.ServiceModel.Channels; namespace WCFChannelSample { class DelegatorOutputSessionChannel<TShape> : DelegatorChannelBase<TShape>, IOutputSessionChannel where TShape : class, IOutputSessionChannel { internal DelegatorOutputSessionChannel(ChannelManagerBase channelManagerBase, TShape innerChannel, string source) : base(channelManagerBase, innerChannel, source) { } ... } }