带回调的双工服务

时间:2011-11-24 19:46:25

标签: c# wcf

假设我们使用以下方法提供服务。

[ServiceContract(SessionMode = SessionMode.Required, CallbackContract = typeof(ISampleServiceCallback))]
interface ISampleService
{
    [OperationContract(IsOneWay = true, IsInitiating = true, IsTerminating = false)]
    void Connect(string version);

    [OperationContract(IsOneWay = true, IsInitiating = false, IsTerminating = false)]
    void Request(string uuid, string description);

    [OperationContract(IsOneWay = true, IsInitiating = false, IsTerminating = true)]
    void Disconnect();
}

interface ISampleServiceCallback
{
    [OperationContract(IsOneWay = true)]
    void Reply(string uuid, string description);
}

客户端调用 Connect 方法,并在客户端和服务器之间启动新会话。 在此会话期间,客户端可以调用 Request 方法...服务器在收到请求消息后,如果能够响应客户端,则使用回调发送回复。

现在假设这两个节点不是客户端和服务器,但它们是两个节点。我怎样才能进行双向沟通?我希望两个节点中的每一个都可以调用另一个节点的请求......是否可能? 换句话说,两个节点中的一个决定通过调用另一个节点的Connect方法与另一个节点创建一个新会话...如果后者接受连接,则会创建一个新的通信会话,但两个节点必须能够调用另一个节点的方法。

我的想法是在两个节点之间创建两个会话:在第一个会话中,节点A是客户端,而节点B是服务器;第二个会话的方向相反:节点B是客户端,而节点A是服务器。 但是,通过这种方式,我有两个TCP连接......还有其他选择吗?

以下图表说明了它应如何运作:http://imageshack.us/photo/my-images/600/multipleservices.png/

非常感谢!

2 个答案:

答案 0 :(得分:1)

您是否调查过NetPeerTcpBinding绑定?您也可以使用某种对等解析器,我认为WCF默认使用PNRP(来自Microsoft的对等名称解析协议)。或者,如果您有冒险精神,可以实施自己的同行解析器。

答案 1 :(得分:1)

你想要的是双工通信,对吧?这取决于绑定,是否可能。您可以使用WsDualHttpBinding,但不建议这样做,因为它不是官方标准。大多数Tcp绑定支持双工。您可以找到information herepost