使用WCF包装现有连接的流

时间:2012-03-01 10:06:34

标签: wcf connection 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();

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

问题

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

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

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

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

在此阶段,我们将不胜感激。

1 个答案:

答案 0 :(得分:0)

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