为什么即使Lifetime返回null,我的C#Remoting对象也会超时?
|
这是经过数天的谷歌搜索来找到我的问题的明确答案的最后手段。
我已经创建了Windows服务,Windows窗体和Remoting对象(全部在C#中)。我正在使用Remoting对象通过事件在服务和表单之间进行通信。
这是对象之间典型交互的简化示例:
AdminForm调用RemoteObject的方法RequestLoadForm()
RemoteObject触发AdminService正在监听的事件
通知AdminService事件,并在RemoteObject上调用LoadFormData(字符串数据)
RemoteObject触发AdminForm正在监听的事件
AdminForm被通知该事件,并且可以使用字符串数据在AdminForm的控件上设置值
一切正常,在前5分钟左右的时间内,一切都能很好地交互。之后,对象之间的连接会以某种方式断开,并且我无法再在对象之间进行通信。
解决该问题的第一个尝试是覆盖InitializeLifetimeService方法以返回null。这没有帮助(尽管可以避免将来出现任何租赁问题)。
第二次尝试是使我的AdminForm和AdminService ISponsors成为RemoteObject,并设置它们以续订该对象上的租约。再一次,没有解决问题。
在各种Google搜索中,我发现有人提到事件处理程序被垃圾回收。我不确定这是否是问题,但我想我会提一下。
连接空闲超过5分钟后,会弹出此错误消息:
用户代码未处理System.Runtime.Remoting.RemotingException
消息= \“找不到请求的服务”
源= \“ System.Runtime.Remoting \”
现在,关于此的奇怪的事情是它发生在AdminService端。 AdminForm可以很好地调用RemoteObject上的方法。这会弹出事件,然后AdminService会看到此事件,并尝试调用RemoteObject的方法LoadFormData(string data),这是引发异常的地方。
由于我似乎找不到解决问题的方法,因此我对Google搜索完全感到精疲力尽。
没有找到相关结果
已邀请:
5 个回复
厢界山攀
宦哨抹存胳
唤副埂侧壬
但我更喜欢使用租赁/赞助商(在客户端) http://msdn.microsoft.com/en-us/library/6tkeax11.aspx
如果在编组过程中还有其他问题,请使用System.Runtime.Remoting.Services.TrackingServices命名空间 http://msdn.microsoft.com/zh-CN/library/system.runtime.remoting.services.trackingservices.aspx
讼乐
然后,移除的对象应具有无限的使用寿命。
茂坦湿床够
。在源代码中搜索所有提及ѭ5的内容,并给每个人一个长而刻苦的外观。 无限租约仅持续到卸载应用程序域。在源代码中搜索所有有关ѭ6的内容,并给每一个卸载任何AppDomain的内容长而艰苦的外观。 AppDomain可能已经重新加载,并且进程终止,例如Win32服务重新启动。如果将服务器部署到某种类型的应用程序服务器中,并且某些部署操作或错误恢复触发了重新加载,则也可以由第三方代码卸载它。检查第三方日志以找到证据。 添加足够的日志记录,并仔细研究异常堆栈跟踪,以确保您没有调用第三方服务器对象(可能通过您自己的无限租约服务器对象),也不会调用已加载的旧版本代码谁知道在哪里,以便上面的源代码研究可能会错过它。 我刚刚完成了对事件的研究,结果发现该事件是列表中第一项和最后一项的组合。