[Remoting]当client不复存在而RemoteObject并不知道时的处理办法

简介:
[Remoting]当client不复存在而RemoteObject并不知道时的处理办法
编写者:郑昀@ultrapower 20050518

问题:
“singleton服务中客户端意外退出或网络故障时,服务器端如何知道,并作相应的业务层处理”。
背后的故事:
对于这个问题, http://www.dotnetjunkies.com/Tutorial/BFB598D4-0CC8-4392-893D-30252E2B3283.dcik 有一个描述,他针对这种情况“Item 3) The Remote Object Does Not Explicitly Know When A Client Is No Longer Around. ”说道:
这时候远端服务器端对象总会抛出 System.Net.Sockets.SocketException 异常,所有在这个dead client之后的client将永不会收到事件通知。这个原因是:If an invoked method throws an exception, the method stops executing, the exception is passed back to the caller of the delegate, and remaining methods in the invocation list are not invoked. Catching the exception in the caller does not alter this behavior 
他给出的基本思路是:
The basic idea is that we 
1) gain access to the multicast delegate instance that contains our event subscribers in its invocation list 
2) loop through this invocation list and try to manually call invoke on each item 
3) catch any exceptions from dead clients 
4) remove dead client subscriptions from the invocation list 
5) continue manually calling invoke on all the remaining items in invocation list. 

那么就是轮循解决了:
(客户端靠不住,估计只能依靠服务器端主动了): 
public delegate void DelegateUsed( parameter list ); 

public event DelegateUsed ExampleEvent; 

public void RaiseExampleEvent( ) 

Delegate[] targets = DelegateUsed.GetInvocationList(); 

foreach( DelegateUsed client in targets ) 

try 

// Callback to client... 
client( parameter list of delegate ); 

catch 

// Failed to callback to client, remove registered delegate. 
RemoteFavoriteChanged -= client; 



这样剔除那些不存在了的client。

编写者:郑昀@ultrapower
目录
相关文章
|
网络协议 Linux 网络安全
|
Oracle 关系型数据库 Linux
|
存储 Oracle 关系型数据库
|
存储 虚拟化 云计算
|
存储
【随想】每日两题Day.21
【随想】每日两题Day.21
134 0
|
测试技术 数据库
确保数据访问层的可靠性:详细解析使用Entity Framework Core进行隔离的单元测试方法
【8月更文挑战第31天】在软件开发中,单元测试是确保代码质量的关键。本文通过一个在线商店的商品查询功能案例,介绍了如何使用EF Core和Moq框架实现数据访问层的隔离测试。通过模拟`ApplicationDbContext`,我们能够在不访问真实数据库的情况下对`ProductService`进行单元测试,提高测试效率并保证测试稳定性。这种方法是实现高效、可靠单元测试的重要手段。
227 0