使用WCF封装现有的连接流

17
我有一个双向连接的 Stream 的两端,我想在上面进行通信。流的底层实现并不重要,我想在 Stream 级别上工作...
与其为流实现自己的通信协议,我想利用所有现有的 WCF 优点,使用双向(请求/响应 + 回调)WCF 通信通道来包装现有的流。
我的问题是,我该怎么做呢...?
更新:
我已经采取了实现自定义传输的方法。我已经实现了这个功能,但我仍然不完全满意...
我已经实现了一个 IDuplexSessionChannel 来包装流,还有适当的 IChannelFactoryIChannelListener,以及创建通道工厂的 Binding Element。现在,我只需通过已连接的流,最终在创建传输通道时将其传递到传输通道中。
因此,我可以按照以下方式创建客户端代理以通过流访问服务:
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设置了使用 ServiceHost 创建通道的服务器端,通过 IChannelListener。在我的情况下,我已经有一个连接的流,而且我将无法监听任何更多的传入连接。我可以解决这个问题,但我不想使用 ServiceHost 来创建通道的服务器端,因为这会导致很多模糊的样板和hack来使其工作。
问题:
因此,我正在寻找更好的方法来获取 IDuplexSessionChannels,并在服务器和客户端两端将其包装成通道代理。
或者可能是一个不需要 IChannelListener 的不同 ServiceHost 实现。
真正的问题在于,我不想要单个服务器、多个客户端的安排,我在我的 WCF 服务和客户端之间有一个1-1的关系。是否有正确的方法来实例化其中之一?
换句话说,我想创建服务器端的服务实例,而不使用 ServiceHost。
在这个阶段,任何建议都将不胜感激。

似乎您可能混淆了WCF服务主机和WCF服务实例的角色。 WCF服务主机根据InstanceContextMode提供服务实例。这篇博客文章很好地解释了它的工作原理。没有ServiceHost提供,您真的无法拥有WCF服务的实例。反过来,ServiceHost依赖于ChannelListener来管理其消息基础结构。如果没有它,您将拥有一个“聋”的ServiceHost :) - Sixto Saez
所以,我的目标是要做ServiceHost创建一个InstanceContext和Service实例的事情。当ServiceHost接受新的传入连接时,它必须执行此操作。我已经建立了连接,所以我想跳过监听部分。这肯定不是不可能的...? - Mark
@Mark 对我来说,这似乎是在采取现有的隧道并建造另一个隧道来包含它... WCF 并不是为这种情况而建立的... 你到底对现有流(你写道它正在工作)有什么问题,让你认为使用 WCF 将会解决? - Yahia
好的,我有一些通过一些明确定义的接口公开的进程内服务。我想使用子进程透明地重新实现这些服务,这些子进程通过继承的管道流进行通信。实际上,WCF只是为我提供了一种很好的实现服务调用、故障契约等的方式,而不必在管道上自己编写消息子系统。我以前在C++中自己编写过,但我希望从.NET那里得到一些帮助来完成同样的工作。 - Mark
嗨,马克,你在这方面有进展吗?我想做同样的事情来扩展使用匿名管道,并与你相同的用例一起使用。匿名管道是正确的选择,但要利用WCF中的所有通信RPC基础设施。 - Jason Kleban
显示剩余2条评论
1个回答

1

在两端使用客户端。但需要仔细定义合同。如果在流的两端有ClientA和ClientB,当ClientA发送请求时,ClientB将期望它看起来像它定义的回调合同一样,并反之亦然。


我会接受这个答案,因为我认为它很可能是正确的(至少,它让人觉得它应该能够工作)。虽然我没有尝试过,但你的经验可能会不同。 - Mark

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接