Remoting Event 远程事件

简介: 在.Net Remoting的应用中,经常碰到需要预定Remoting Object的事件的情况,要能使远程事件发布/预定如预期中的进行,需要注意如下问题:1. Remoting 配置    在Remoting配置文件中,需要将typeFilterLevel设置为Full,否则,将出现RemotingHandler无法序列化的异常。

    在.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 
                    }
                }
            }



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






目录
相关文章
|
3月前
|
Java
【Azure 事件中心】向Event Hub发送数据异常 : partitionId[null]: Sending messages timed out
【Azure 事件中心】向Event Hub发送数据异常 : partitionId[null]: Sending messages timed out
|
2天前
|
API 开发者
WebSocket API 中的 onerror 事件和 close 事件有什么不同?
【10月更文挑战第26天】`onerror`事件侧重于通知开发者WebSocket连接过程中出现的错误,以便进行相应的错误处理和恢复;而`close`事件则主要用于在连接关闭时进行资源清理和根据关闭情况采取适当的后续操作。两者在WebSocket应用的开发中都起着重要的作用,帮助开发者更好地管理和处理WebSocket连接的各种情况。
|
3月前
|
分布式计算 Java Spark
【事件中心 Azure Event Hub】使用Logstash消费EventHub中的event时遇见的几种异常(TimeoutException, ReceiverDisconnectedException)
【事件中心 Azure Event Hub】使用Logstash消费EventHub中的event时遇见的几种异常(TimeoutException, ReceiverDisconnectedException)
|
3月前
|
消息中间件 Java 开发工具
【Azure 事件中心】Spring Cloud Stream Event Hubs Binder 发送Event Hub消息遇见 Spec. Rule 1.3 - onSubscribe, onNext, onError and onComplete signaled to a Subscriber MUST be signaled serially 异常
【Azure 事件中心】Spring Cloud Stream Event Hubs Binder 发送Event Hub消息遇见 Spec. Rule 1.3 - onSubscribe, onNext, onError and onComplete signaled to a Subscriber MUST be signaled serially 异常
|
3月前
【Event Hub】消费消息时遇到Azure.Messaging.EventHubs.EventHubsException(QuotaExceeded) 错误的解决之法
【Event Hub】消费消息时遇到Azure.Messaging.EventHubs.EventHubsException(QuotaExceeded) 错误的解决之法
|
6月前
|
存储 Java Linux
Android系统获取event事件回调等几种实现和原理分析
Android系统获取event事件回调等几种实现和原理分析
321 0
Revit空闲事件(Idling Event)增强和外部事件(External Event)
Revit空闲事件(Idling Event)增强和外部事件(External Event)
Revit空闲事件(Idling Event)增强和外部事件(External Event)
|
C#
C# 从1到Core--委托与事件(二)
 委托与事件在C#1.0的时候就有了,随着C#版本的不断更新,有些写法和功能也在不断改变。本文温故一下这些改变,以及在NET Core中关于事件的一点改变。
174 0
|
C#
C# 从1到Core--委托与事件(一)
 委托与事件在C#1.0的时候就有了,随着C#版本的不断更新,有些写法和功能也在不断改变。本文温故一下这些改变,以及在NET Core中关于事件的一点改变。
205 0