zoukankan      html  css  js  c++  java
  • Remoting Event 远程事件

        在.Net Remoting的应用中,经常碰到需要预定Remoting Object的事件的情况,要能使远程事件发布/预定如预期中的进行,需要注意如下问题:

    1. Remoting 配置
        在Remoting配置文件中,需要将typeFilterLevel设置为Full,否则,将出现RemotingHandler无法序列化的异常。
        如可能的channels配置
       《Server端》

              <channels>
                    
    <channel ref="tcp" port="9009" >
                        
    <serverProviders> 
                            
    <provider ref="wsdl" /> 
                            
    <formatter ref="soap" typeFilterLevel="Full" /> 
                            
    <formatter ref="binary" typeFilterLevel="Full" /> 
                        
    </serverProviders> 
                         
    <clientProviders>
                              
    <formatter ref="binary" />
                         
    </clientProviders>
                    
    </channel>        
                
    </channels>

       
      《对应的Client端》

                <channels>
                    
    <channel ref="tcp" port="0">
                        
    <serverProviders> 
                            
    <provider ref="wsdl" /> 
                            
    <formatter ref="soap" typeFilterLevel="Full" /> 
                            
    <formatter ref="binary" typeFilterLevel="Full" /> 
                         
    </serverProviders> 
                    
    </channel>     
                
    </channels>



    2.客户端中预定事件的宿主类(以下称 host class)必须从MarshalByRefObject继承。这是因为当host class将事件处理句柄注册到远程服务器时,句柄中包含了host class的引用,所以host class需要从MarshalByRefObject继承,以便远程服务对象能取得host class引用。这个时候,可以将host class看成远程服务对象,而真正的RemotingObject变成了客户端。

    3.事件处理函数必须是public的,因为真正的RemotingObject需要通过host class的代理访问到这个函数,如果是private,将会抛出“无法序列化private方法”的异常。

    4.远程服务端需要引用(在运行时自动查找)host class所在的Assembly,所以如果host class仅包含在客户应用程序(如Client.exe)中,则需要将Client.exe拷贝到远程服务器程序所在目录。最好的办法是,将host class放在一个公共的.dll中,然后分别由服务器和客户端引用。

    5.事件处理函数若含有引用类型的参数,则参数要么是可序列化的,要么从MarshalByRefObject继承,原因同三。当参数类型是从MarshalByRefObject继承的时候,就更复杂了,需要你仔细分析(因为这个参数类型中可能还包含其它的引用类型)。

    6.事件处理函数抛出的异常必须是可序列化的--其实,你应该保证所有的自定义异常都必须是可序列化的。

    7.Remoting Object在触发远程事件的时候,必须对每一个事件处理函数进行论询触发,并捕获每一次触发抛出的异常,否则,当异常发生后,后面的事件处理函数就不会被调用了。应该像下面这样:

                if(this.ServiceListChanged != null)
                {                
                    
    object[] args = new object[2] ;
                    args[
    0= this.fsConfiguration.ServerID ;
                    args[
    1= this.GetServiceList() ;

                    
    foreach(Delegate del in this.ServiceListChanged.GetInvocationList())
                    {                    
                        
    try
                        {                        
                            del.DynamicInvoke(args) ;
                        }
                        
    catch(Exception ee)
                        {                    
                            ee 
    = ee ;
                            
    //log 
                        }
                    }
                }



        如果你遇到过的问题,这里没有列出来,请留言和我讨论:)






  • 相关阅读:
    联想 Vibe Shot(Z90-3) 免recovery 获取ROOT权限 救砖 VIBEUI V3.1_1625
    联想 Z5S(L78071)免解锁BL 免rec 保留数据 ROOT Magisk Xposed 救砖 ZUI 10.5.370
    联想 Z5(L78011) 免解锁BL 免rec 保留数据 ROOT Magisk Xposed 救砖 ZUI 10.5.254
    联想 S5 Pro(L78041)免解锁BL 免rec 保留数据 ROOT Magisk Xposed 救砖 ZUI 5.0.123
    第二阶段 冲刺八
    第二阶段 冲刺七
    第二阶段 冲刺六
    第二阶段 冲刺五
    代码大全阅读笔记03
    学习进度十二
  • 原文地址:https://www.cnblogs.com/zhuweisky/p/298562.html
Copyright © 2011-2022 走看看