如何使用WCF包装现有的连接流?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (1)
  • 关注 (0)
  • 查看 (12)

我有一个双向连接的两端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();

我遇到的问题是,似乎WCF使用a ServiceHost创建通道的服务器端,通过IChannelListener。在我的情况下,我已经有一个连接的流,我不能监听任何更多的传入连接。我可以解决这个问题,但我宁愿不使用a ServiceHost来创建通道的服务器端,因为我最终得到了许多难以理解的样板和黑客来使其工作。

问题

因此,我正在考虑采用IDuplexSessionChannels的更好方式,并将这些包装到服务器端和客户端的Channel代理中。

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

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

换句话说,我想创建服务器端服务实例而不使用ServiceHost。

提问于
用户回答回答于

在两端使用客户端。将需要仔细定义合同。如果ClientA和ClientB位于数据流的任一端,当ClientA发送请求时,ClientB会期望它看起来像它定义的回调契约,反之亦然。

扫码关注云+社区