我有双向连接Stream
的两端,我想做一些沟通。流后面的底层实现并不重要,我想在Stream
级别工作......
我不想为流实现自己的通信协议,而是希望使用所有现有的WCF优势来使用双向(请求/响应+回调)WCF通信通道包装现有流。
我的问题是,我怎么能这样做??
更新
我走了实现自定义传输的道路。我有这个工作,但我仍然不满意......
我已经实现了IDuplexSessionChannel
来包装流,以及适当的IChannelFactory
和IChannelListener
,以及用于创建渠道工厂的绑定元素。现在,我只是通过连接的流,并在创建它时最终将它们传递到传输通道。
因此,我可以创建客户端代理,通过流访问服务,如下所示:
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的情况下创建服务器端服务实例。
在此阶段,我们将不胜感激。
答案 0 :(得分:0)
两端都使用客户端。您需要仔细定义合同。如果您在流的任何一端都有ClientA和ClientB,那么当ClientA发送请求时,ClientB会期望它看起来像它所定义的那样定义的回调契约,反之亦然。