【问题标题】:How to "bind" services to specific channels (tcp, http, ipc) in a .NET Remoting server?如何将服务“绑定”到 .NET Remoting 服务器中的特定通道(tcp、http、ipc)?
【发布时间】:2023-09-30 22:47:01
【问题描述】:

我有一个复杂的 .NET Remoting 服务器应用程序,它提供了一些服务。客户端目前可以使用 tcp 和 http 通道连接到服务器。

现在我需要实现一些新的管理服务,但我想限制它们对本地机器的可用性,即我想创建一个可以使用这些新服务的管理工具,但我不希望敏感数据物理离开服务器,所以我需要限制在同一台服务器计算机上运行管理工具。

我考虑添加新服务并在服务器上注册 ipc 通道以供管理工具使用。现在问题来了:如何防止远程客户端使用 tcp 或 http 通道连接到这些新的管理服务?我可以在 app.config 中说类似“注册服务 x,由程序集 A 中的 C 类实现,只能通过 ipc 使用”,“注册服务 y,由程序集 A 中的 D 类实现,可通过 tcp/http 使用”之类的话(或使用远程基础设施类)?

令我困惑的是“只能通过 ipc 使用”部分。 (不,现在不能移植到 WCF。)

【问题讨论】:

  • 我开始使用 .NET Remoting -- 你能告诉我你是否曾经尝试过注册多个 HttpChannel,如果是,你成功了吗?
  • 戴夫,很抱歉没有早点入住。答案是否定的,我只在生产中同时使用了单个 tcp 和 http 通道。但是让我找出一些较旧的代码并为您检查。几分钟后回来。
  • 好的,所以看起来它不起作用。 ChannelServices.RegisterChannel() 在尝试注册 http 通道两次时抛出“通道已注册”异常,无论我是从配置还是代码中设置远程处理。我想这是不支持的(我已经转移到 WCF,所以我对远程处理的直觉可能已经生锈了。)

标签: c# .net remoting


【解决方案1】:

RegisterWellKnownServiceType 没有重载允许您指定在哪个通道上注册,IPCServerChannel 上也没有任何方法来注册服务,因此这些都不起作用。

我能想到的最好的方法是编写一个 ChannelSink 来过滤您的消息或提供安全性。这些可以添加到您的 TcpChannel 和 HttpChannel 的构造函数中,以过滤掉仅管理员调用。

【讨论】:

  • 谢谢,罗伯。看起来我无意中把自己画在了这个角落里。
  • 更像是 .NET Remoting 把你逼到了墙角 ;) 当我第一次阅读你的帖子时,我认为这很容易,直到我查看了代码。
【解决方案2】:

获取调用它的服务的 IPAddress。如果不是 127.0.0.1 则拒绝来电。

【讨论】: