码迷,mamicode.com
首页 > 其他好文 > 详细

Remoting自定义通道

时间:2017-11-07 12:16:20      阅读:169      评论:0      收藏:0      [点我收藏+]

标签:ret   server   private   逻辑   业务   base   getc   class   请求   

服务端

信道:

class SecureServerChannelSink:BaseChannelSinkWithProperties,IServerChannelSink
{
        /// <summary> 接受器链表中的下一个接收器 </summary>
        private IServerChannelSink _next;
       
        /// <summary>
        /// 构造函数
        /// 初始化安全通道接收器
        /// </summary>
        public SecureServerChannelSink(IServerChannelSink nextSink) 
        {
            //设置下一个接收器
            _next = nextSink;
        }
        /// <summary>
        /// 请求从当前接收器对异步发送的方法调用的响应进行处理
        /// </summary>
        public void AsyncProcessResponse(IServerResponseChannelSinkStack sinkStack, object state, IMessage msg, ITransportHeaders headers, Stream stream)
        {
             //当前接收器处理业务逻辑....
             //下一个接收器处理
            _next.AsyncProcessResponse(sinkStack, state, msg, headers, stream);
        }
        
        /// <summary>
        /// 返回提供的响应消息将序列化到其上的 System.IO.Stream
        /// 需要创建响应流时将调用此方法
        /// </summary>
        public Stream GetResponseStream(IServerResponseChannelSinkStack sinkStack, object state, IMessage msg, ITransportHeaders headers)
        {
              //当前接收器处理业务逻辑....
             //下一个接收器处理
            return _next.GetResponseStream(sinkStack, state, msg, headers);
        }
        
        /// <summary>
        /// 获取服务器接收器链中的下一个服务器信道接收器
        /// </summary>
        public IServerChannelSink NextChannelSink
        {
            get { return _next; }
            set { _next = value; }
        }

        /// <summary>
        /// 现有的接收器的请求处理
        /// 代理的工作就是将对其进行的方法调用转换为消息对象。 通过对消息接收器对象调用 ProcessMessage,将该消息对象(实现 IMessage 接口)从客户端传递到服务器端。 消息接收器以如下方式链接在一起:每个消息接收器负责在执行完它的工作后对下一个消息接收器调用 ProcessMessage。 例如,一个与同步相关的消息接收器可以使锁被获取或释放,然后被委托给下游的消息接收器。
        /// </summary>
        /// <param name="sinkStack">调用了当前接收器的信道接收器的堆栈</param>
        /// <param name="requestMsg">包含请求的消息</param>
        /// <param name="requestHeaders">从来自客户端的传入消息中检索到的标头</param>
        /// <param name="requestStream">需要进行处理并传递到反序列化接收器的流</param>
        /// <param name="responseMsg">响应消息的</param>
        /// <param name="responseHeaders">响应的头信息</param>
        /// <param name="responseStream">响应的流</param>
        /// <returns>返回服务器消息处理状态枚举</returns>
        public ServerProcessing ProcessMessage(IServerChannelSinkStack sinkStack, IMessage requestMsg, ITransportHeaders requestHeaders, Stream requestStream, out IMessage responseMsg, out ITransportHeaders responseHeaders, out Stream responseStream)
        {
             //当前接收器处理业务逻辑....
             //下一个接收器处理
            return _next.ProcessMessage(sinkStack, requestMsg, requestHeaders, requestStream, out responseMsg, out responseHeaders, out responseStream);
        }
    

 

信道提供程序:

class SecureServerChannelSinkProvider : IServerChannelSinkProvider
    {
        /// <summary>接收器链表中下一个接收器提供器</summary>
        private IServerChannelSinkProvider _next = null;
     
        /// <summary>
        /// 构造函数
        /// 初始化接收器提供器
        /// 为了使用基于文件的配置提供程序,需要使用这个构造函数。它不需要做任何事情,除非您想使用参数中的信息。
        /// </summary>
        /// <param name="properties">在配置文件中的参数描述</param>
        /// <param name="providerData">接受提供器数据</param>
        public SecureServerChannelSinkProvider(IDictionary properties, ICollection providerData)
        {
            foreach (DictionaryEntry entry in properties)
            {
                switch ((string)entry.Key)
                {
                    //这里可以获取配置文件中的参数
                    default:
                        break;
                }
            }
        }

        #region IServerChannelSinkProvider接口实现方法
        /// <summary>
        /// 创建接收器链
        /// </summary>
        /// <param name="channel">要为其创建信道接收器链的信道</param>
        /// <returns>新生成的信道接收器链中的第一个接收器,或 null(指示此提供程序将不会或不能为此终结点提供连接)</returns>
        public IServerChannelSink CreateSink(IChannelReceiver channel)
        {
            IServerChannelSink nextSink = null;
            if (_next != null) 
            {
                //在链表中的下一个接收器提供器创建下一个接收器对象
                if ((nextSink = _next.CreateSink(channel)) == null)
                    return null;
            }
            //创建本接受器并将上一个接收器的信息传送给它
            return new SecureServerChannelSink(nextSink);
        }
        /// <summary>
        /// 返回与当前接收器关联的信道的信道数据
        /// </summary>
        public void GetChannelData(IChannelDataStore channelData)
        {
            
        }

        /// <summary>
        /// 获取或设置信道接收器提供程序链中的下一个接收器提供程序
        /// </summary>
        public IServerChannelSinkProvider Next
        {
            get { return _next; }
            set { _next = value; }
        }
        #endregion

 

Remoting自定义通道

标签:ret   server   private   逻辑   业务   base   getc   class   请求   

原文地址:http://www.cnblogs.com/shenshiting/p/7798243.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!