本项目以客户端激活方式调用远程对象,并且使用了生命周期管理,
目的是让客户端意外退出时一些在线信息可以及时销毁。
服务端配置:
<lifetime leaseTime = "10S" sponsorshipTimeOut = "5S"
   renewOnCallTime = "10S" pollTime = "3S"/> 客户端获取远程对象实例:
public class RmManager
{
private static RmManager instance;
private static CallerBizRemote Rm=null;
ClientSponsor sponsor=null;
public static RmManager GetInstance()
{

if (instance == null)
{
lock (typeof(RmManager))
{
if (instance == null)
{
RemotingConfiguration.Configure("Caller.exe.config");
instance = new RmManager();
}
}
}
return instance;
} public CallerBizRemote GetBizRemote()
{

if (Rm==null)
{
CreateBizRemote();
}
else
{
try
{
Rm.GetLifetimeService();

}
catch
{
CreateBizRemote();
}
}
return Rm;

} public void CreateBizRemote()
{
Rm=new CallerBizRemote();
sponsor= new ClientSponsor();
//每次服务器上远程对象租用过期后将自动调用sponsor的Renewal()来接受续订,下面指定了续订的时间
sponsor.RenewalTime=TimeSpan.FromSeconds(3);
ILease lease =(ILease)Rm.GetLifetimeService();
lease.Register(sponsor); }
}在大多数情况下,客户端意外退出或网络断开,服务器几秒钟后能通过DisconnectedObject(Object obj)正确识别出退出的客户端并做相应处理。没有退出的客户端闲置很久也不会被服务器误认为退出。
但是在少数情况下:
1、客户端并没有退出只是闲置了几分钟,服务器却认为客户端退出了。甚至服务器和客户端同在一台电脑上也出现过这种情况。
2、客户端程序已经关闭,任务管理器中没有该进程了,可是服务器等了很久也无法检测客户端已经退出。难道remoting的生命周期机制有bug??那又是什么原因呢?