在.Net Remoting中,“.NET Remoting Framework”具体或具体是什么?

时间:2016-05-18 22:20:42

标签: c# .net sockets .net-remoting

TL; DR:

我正在尝试查找运行.Net Remoting Framework的位置(例如,服务名称或进程名称)。此外,来源将是惊人的。

上下文

我正在维护使用.Net远程处理的遗留代码,以允许使用在两个进程之间存储连接信息的对象,并且由于那些远程连接对象超时而长期存在随机断开连接和崩溃的问题。我们已经看到的问题在this post的答案中被提及,特别是位:

  

我的问题是使用Marshal注册远程处理对象。随着时间的推移,远程处理对象将消失以供客户端使用,即不再在远程处理对象上。

我们过去使用的“修复”方法就是那篇​​文章中提到的:返回一个空租赁管理器,它可以永久保持对象的存活,以避免随机的不必要的超时。

几年前,该代码被删除了,因为它在Linux上引起了一个问题 - 基本上,每个连接在它有用之后仍然存在就会消耗套接字,并且由于套接字是Linux上的文件,我们就会用完文件描述符。由于我们认为超时问题受影响最大的功能已被弃用,我们恢复了常规超时,一切都很好,两年了。

最近,最近Windows的一个补丁或其他一些环境变化似乎导致了我们的一些机器上完全无法恢复不需要的超时问题(仅在Windows上; Mono似乎很好地处理了这个工作流程,给出了我强烈预感这是一个.Net bug)。具体来说,任何时候我们在另一个客户端维持连接约5个小时或更长时间后尝试连接新客户端时,该过程会在尝试连接到TCP端口时挂起,如果我理解正确的话,那就是Remoting Framework告诉我们的内容是我们的服务器正在监听的地方。

由于这削弱了我们的Windows使用率,导致这个缺陷最终得到了正确解决的推动,而我现在想要解决的是为什么,经过一段时间~5小时不断连接一个客户端,我们不再能够从新的客户端进程到服务器进行远程连接。但首先,为了做到这一点,我想了解整个工作流程,其中包括了解.Net Remoting Framework中正在发生的事情,该框架存储了首先要创建的远程连接所需的信息。但是,我读到的所有内容都只提到了框架,而不是解释它到底是什么。

问题:

关于.Net远程处理的

Many different(PDF警告)articles将“.Net远程处理框架”称为存储有关使用{{{0}注册的对象的信息的关键部分。 1}}或RemotingServices.Marshal。如果我理解正确,那么它允许其他客户端.Net进程使用两个进程都知道为密钥的URI来查询这些对象。

此查询过程或服务在哪里?老实说,即使答案是我在文档中明显错过的内容,我也会因为拥有它而欣喜若狂。谢谢!

(当然,对我的更大问题的任何其他见解将不胜感激。)

编辑:“更大的问题”似乎是我们运行的安全软件程序干扰了我们工作机器中的网络适配器,有时会导致System.Net.Sockets.SocketExceptions发生在我们的远程程序试图通过这些插座连接时。这意味着当LeaseManager检查Lease是否仍在为RemotingObject工作时,它会看到一个套接字错误并反复认为Lease是断开连接的,因此删除我们希望保持活动的对象引用。我们的方法是返回RemotingServices.RegisterWellKnownSericeType函数返回null,并使用Dispose模式自己处理所有对象垃圾收集。完整描述为here.

1 个答案:

答案 0 :(得分:1)

它运行在配置部分中定义主机的应用程序的任何位置,可以是IIS,Windows服务或控制台应用程序。客户端应用程序也需要有一些配置,告诉它该类实际上是远程主机的代理。

远程处理中使用的类型位于Sytem.Runtime.Remoting命名空间中。

我从来没有使用远程处理,我将对象代理保持了几个小时;我认为你通常想要新的,使用它,然后丢弃它。如果不可能,请检查模式。 SingleCall可能是最好的选择,因为在主机端为每个远程处理请求创建一个新对象,并在完成时销毁。如果编码不正确,或者可能存在内存泄漏或其他问题,则较长时间存在的对象可能会出现一些陈旧状态。

我们仍然为ClickOnce智能客户端使用远程处理,我们没有遇到您遇到的超时问题,但我们的远程处理仅针对SingleCall配置。

从链接中,这将是托管应用程序中的配置:

<configuration>
  <system.runtime.remoting>
    <application>
      <service>
        <wellknown mode="SingleCall" type="Hello.HelloService, Hello" 
objectUri="HelloService.soap" />
      </service>
    </application>
  </system.runtime.remoting>
</configuration>

这在客户端:

<configuration>
  <system.runtime.remoting>
    <application>
      <client>
        <wellknown type="Hello.HelloService, Hello" 
url="http://localhost:8000/HelloService.soap" />
      </client>
    </application>
  </system.runtime.remoting>
</configuration>