• 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 
                        }
                    }
                }



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






  • 相关阅读:
    centos7 安装mysql
    ketlle windows下的安装(最基本)
    Spark参数详解 一(Spark1.6)
    SSM项目集成Lucene+IKAnalyzer在Junit单元测试中执行异常
    解决jquery.pjax加载后的异常滚动
    码云项目克隆至github
    JFinal获取多个model
    避免layui form表单重复触发submit绑定事件
    解决pjax重复绑定
    jfinal 拦截器中判断是否为pjax请求
  • 原文地址:https://www.cnblogs.com/zhuweisky/p/298562.html
Copyright © 2020-2023  润新知