假设我们使用以下方法提供服务。
[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/
非常感谢!
答案 0 :(得分:1)
您是否调查过NetPeerTcpBinding绑定?您也可以使用某种对等解析器,我认为WCF默认使用PNRP(来自Microsoft的对等名称解析协议)。或者,如果您有冒险精神,可以实施自己的同行解析器。
答案 1 :(得分:1)
你想要的是双工通信,对吧?这取决于绑定,是否可能。您可以使用WsDualHttpBinding,但不建议这样做,因为它不是官方标准。大多数Tcp绑定支持双工。您可以找到information here或post。