17

我有一个双向连接的两端Stream,我想通过它进行一些通信。流背后的底层实现并不重要,我想在这个Stream级别上工作......

我不想为流实现我自己的通信协议,而是想使用所有现有的 WCF 优点通过双向(请求/响应 + 回调)WCF 通信通道来包装现有流。

我的问题是,我该怎么做……?

更新:

我已经走上了实现自定义传输的道路。我已经完成了这项工作,但我仍然对此并不完全满意......

我已经实现了一个IDuplexSessionChannel包装流,以及适当的IChannelFactoryandIChannelListener和一个用于创建通道工厂的绑定元素。现在,我只是通过连接的流,并最终在创建时将它们传递到传输通道。

因此,我可以创建客户端代理以通过流访问服务,如下所示:

var callback = new MyCallback();
var instanceContext = new InstanceContext( callback );
var pipeFactory = new DuplexChannelFactory<IMyService>( instanceContext, new StreamBinding(clientStream),
                                                        new EndpointAddress("stream://localhost/MyService"));
var serviceProxy = pipeFactory.CreateChannel();

我遇到的问题是,似乎 WCF 设置为使用 aServiceHost创建通道的服务器端,通过IChannelListener. 就我而言,我已经有一个连接的流,我将无法再监听任何传入的连接。我可以解决这个问题,但我宁愿不使用 aServiceHost创建通道的服务器端,因为我最终会得到很多晦涩的样板和黑客来使其工作。

问题

因此,我正在寻找一种更好的方法来获取 IDuplexSessionChannel,并将它们包装到服务器端和客户端的 Channel 代理中。

或者可能是不需要IChannelListener.

真的,这里的问题是我不想要一个服务器,多个客户端的安排,我的 WCF 服务和客户端之间是 1-1 的关系。是否有正确的方法来实例化其中之一?

换句话说,我想在不使用 ServiceHost 的情况下创建服务器端服务实例。

在此阶段,我们将不胜感激任何建议。

4

1 回答 1

1

在两端使用客户端。不过,您需要仔细定义您的合同。如果您在流的任一端都有 ClientA 和 ClientB,则当 ClientA 发送请求时,ClientB 会期望它看起来像它所定义的回调合约所看到的那样,反之亦然。

于 2015-10-08T20:09:45.467 回答