“对象已断开连接或在服务器上不存在”例外
我需要在我的应用程序中使用跨应用程序域调用,有时我会遇到此 RemotingException:
对象“/2fa53226_da41_42ba_b185_ec7d9c454712/ygiw+xfegmkhdinj7g2kpkhc_7.rem”已断开连接或在服务器上不存在。
目标物体还活着,我已经检查过了。
UPD 我在目标对象的终结器中设置了断点,但它从未命中。因此,这个对象是活动的并且没有被 GC 回收。
I need to use cross-appdomain calls in my app, and sometimes I have this RemotingException:
Object '/2fa53226_da41_42ba_b185_ec7d9c454712/ygiw+xfegmkhdinj7g2kpkhc_7.rem' has been disconnected or does not exist at the server.
The target object is still alive, I have checked it.
UPD I've set breakpoint in the finalizer of the target object, and it never hits. Thus, this object is alive and wasn't GC'ed.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(7)
这可能是因为服务器端的本地垃圾收集器收集了该对象。您可以通过续订租赁来防止这种情况发生。您可以在以下文章中阅读更多相关信息:
更新:不幸的是,2008 年或更早版本的 MSDN 杂志不再可以在线浏览,而只能以 .chm 文件形式浏览,您必须将其下载到本地计算机。以前的问题可以在以下位置找到:
That is probably because the local garbage collector at the server side collects the object. You can prevent that by renewing the leasing. You can read more about that in these articles:
Update: Unfortunately, the MSDN Magazine issues from 2008 or older are no longer browseable online, but only as .chm files that you have to download to your local machine. The previous issues can be found in:
这是因为服务器端的 Lifetime 管理会在对象的租约到期时断开该对象的连接,以允许 GC 来收集它。如果您尝试从客户端使用它,您将收到异常,即使它尚未在服务器上被 GC(例如,因为仍然有另一个引用)但租约已过期。这是为了避免不可预测的行为。已接受的答案为如何正确管理远程 .NET 对象的生命周期提供了很好的参考。
This is because the Lifetime management on the server side disconnects the object when its lease expires, to allow GC to collect it. If you try to use it from the client side, you will get an Exception, even if it has not been GC'd on the server yet (e.g. because there still is another reference to it) but the lease has expired. This is to avoid unpredictable behaviour. The accepted answer provides a good reference on how to correctly manage the lifetime of Remote .NET Objects.
我遇到了同样的问题,并且在许多 StackOverflow 帖子的帮助下搜索了很多个小时。
我终于找到了完整的问题。
以下是完整的解释和用例:
我的类“Loader”继承自 MarshalByRefObject,并且我使用 ISponsor 类使其保持活动状态。我知道 .NET 中存在“ClientSponsor”,但我无法确定是否以及何时调用 Renewal(),因此我在 StackOverflow 社区的帮助下创建了我的类(阅读代码注释):
然后我使用了这个“自定义赞助商” “像这样:
PluginProxy 类型具有对真实插件类型的引用。事实上,PluginProxy 在 Plugin AppDomain 中实例化,并返回到主 AppDomain,以允许它调用插件,即使它忽略插件的真实类型。因此,要从主 AppDomain 访问 PluginProxy,必须进行序列化以跨越 AppDomain 限制。我遇到了一个问题,因为我没有赞助这些 MarshalByRefObject(s) :
这是一堆很难解决的问题,希望这会有所帮助!
参考文献:
StackOverflow: 远程赞助商停止被调用
StackOverflow:ISponsor 和 ILease 接口如何工作?
I had the same problem and I searched for many hours with help of many StackOverflow posts.
I finally found the complete issue.
Here is the complete explanation and use case :
My class "Loader" inherits from MarshalByRefObject, and I keep it alive with a ISponsor class. I know "ClientSponsor" exists in .NET, but I had no way to determine if and when Renewal() is called, so I made my class with help of StackOverflow community (read code comments) :
And then I used this "custom sponsor" like this:
The PluginProxy type has a reference towards the real plugin type. Indeed, the PluginProxy is instanciated inside Plugin AppDomain, and returned to main AppDomain, to allow it to call Plugins even if it ignore their real type. So the PluginProxy, to be accessible from main AppDomain, have to be serialized to cross AppDomains limits. I had a problem because I didn't sponsored these MarshalByRefObject(s) :
It was a difficult bunch of problems to solve, hope this helps !
References:
StackOverflow: Remoting sponsor stops being called
StackOverflow: How do the ISponsor and ILease interfaces work?
这个问题已经详细回答了StackOverflow。 TL/DR:
InitializeLifetimeService
返回 nullClientSponsor< /code>
让你的对象存活更长时间。
This question has been answered in great detail already on StackOverflow. TL/DR:
InitializeLifetimeService
to return nullClientSponsor
to keep you object alive longer.这发生在我们身上,因为我们的一个类中有一个 AppDomain 类型的静态变量。该类用于长时间运行的 Windows 服务。
AppDomain 有一个 InitializeLifetimeService 方法,需要像这样重写:
我们经常使用它作为私有变量,为自定义构建的外部逻辑加载和卸载一些 dll。
答案取自此处:msdn 回答
因为我们无法在生产时更改此设置,所以我们结束了折衷方案是以随机间隔重新启动 Windows 服务,该间隔短于静态 AppDomain 变量的生命周期,通过反复试验,我们发现它是几天。
这个问题还有助于澄清有关生命周期的一些事情: stackoverflow-question< /a>
This happened for us because we had a static variable in one of our classes that was of type AppDomain. The class was used in a long running windows service.
AppDomain has a InitializeLifetimeService method that needs to be overridden like this:
We were constantly using this as the private variable that loaded and unloaded some dlls for custom built outside logic.
The answer has been taken from here: msdn answer
Because we were not able to change this at production time, we ended with a compromise of restarting the windows service at random intervals that are shorter than the lifetime of the static AppDomain variable which by trial and error we found that it is several days.
This question also helped clarify some things about lifetime: stackoverflow-question
就我而言,问题是在客户端计算机中,有一个虚拟网络适配器处于活动状态,禁用虚拟网络适配器,问题就解决了
in my case, the problem was that in the client computer, there was an virtual network adapter active, disabling the virtual network adapters, the problem was solved
就我而言,这种情况发生在存储在
Web
项目内的App_Data
文件夹中的 SQL LocalDB 中。每当我尝试使用包控制台运行update-database
来使用迁移初始化我的实体框架数据库时,什么也没有发生。然后过了一会儿,我得到了这个错误。我通过修改
App_Data
上的文件权限解决了这个问题。一旦修好,瞧,它就起作用了。In my case, this was happening with SQL LocalDB stored in
App_Data
folder insideWeb
project. Whenever I try to use Package Console to runupdate-database
to init my Entity Framework database using migrations, nothing happens. Then after a while, I get that error.I solved this by revising file permissions on
App_Data
. Once fixed, voila, it worked.