【问题标题】:Select specific channel on Activator.GetObject在 Activator.GetObject 上选择特定通道
【发布时间】:2011-04-28 11:10:57
【问题描述】:

假设您在 .NET Remoting 中注册了两个 TcpChannel。

然后我尝试使用 Activator.GetObject 使用 url tcp://... 获取代理

是否可以选择使用哪个频道?

提前致谢。

【问题讨论】:

  • 请注意:远程处理已被弃用,取而代之的是 WCF。
  • @Inuyasha:是的,但有些人仍然使用弱势群体。净 :-(

标签: .net .net-remoting


【解决方案1】:

你解决了吗?

上周我遇到了完全相同的问题。 (nunit 的一个未公开的轻微副作用是它在加载您的 dll 以运行单元测试(我的问题)时会启动默认的“tcp”通道......然后我正在创建一个带有自定义接收器的自定义 TcpClientChannel 实例来与我们的服务器软件......当我实例化一个服务器对象时,我们的接收器没有触发)

有3种解决方案:

  1. 如果您希望一个永久覆盖另一个,则只需将“优先级”属性传递给 TcpClientChannel 上的 IDictionary 构造函数。如果未设置,则默认值为 1,因此如果您希望它覆盖默认的“tcp”频道注册,则设置为高于 1。注意“name”属性也必须设置,但如果需要可以为 string.Empty(并且那么你可以拥有任意数量的这些)

  2. 注册时为您的频道命名,然后编写一个不错的 IDisposable 包装器以调用“使用”构造,该构造在调用 Activator 时在您不想激活的频道上调用 ChannelServices.Unregister(...) .GetObject(...)。然后,当您的“使用”块结束(即调用 Dispose())时,只需重新加载您未注册的通道...确保您在某些公共对象引用上使用“锁定”,如果它在您的应用程序中是多线程的...这可能会创建一个瓶颈! (这是我采用的方法,因为我的单元测试使用的是预先编写的库来创建服务器连接:为了我的单元测试,生产软件不稳定的风险太高了)

    李>
  3. 在调用 Activator 之前,使用深度反射暂时提升目标通道的优先级(即摆弄私有 FieldInfos...即私有 int _channelPriority(我认为)...使用反射器仔细检查)。获取对象。这也对线程问题开放,也不是框架版本证明(所以我避免了这个)

【讨论】:

  • 我不得不将建议 nr 2 和 3 结合起来,因为清理通道会断开已经连接的连接。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多