使用WCF包装现有连接的流

Mar*_*ark 17 connection wcf custom-binding

我有双向连接的两端Stream,我想做一些沟通.流后面的底层实现并不重要,我想在这个Stream层面上工作......

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

我的问题是,我怎么能这样做......?

更新:

我走了实现自定义传输的道路.我有这个工作,但我仍然不是很满意它...

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

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

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();
Run Code Online (Sandbox Code Playgroud)

我遇到的问题是,似乎WCF设置为使用a ServiceHost创建通道的服务器端,通过IChannelListener.在我的情况下,我已经有一个连接流,我将无法再侦听任何传入的连接.我可以解决这个问题,但我宁愿不使用a ServiceHost来创建频道的服务器端,因为我最终得到了很多模糊的样板和黑客来使它工作.

问题

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

或者可能是不需要的不同ServiceHost实现IChannelListener.

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

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

在此阶段,任何建议都将受到赞赏.

小智 1

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