如何在WCF中实现回调?

时间:2010-12-06 22:42:57

标签: .net wcf

在进行异步WCF服务调用时,该服务能够(并且必须)执行收到的回调。这在一般的APM中是有意义的,但在WCF情况下,回调实际上是在客户端执行的,这意味着essense中的服务器能够执行客户端代码。

有人可以说明这是如何实施的吗?例如,当使用http绑定时,当服务执行回调时,它是否开始发送回WCF客户端反序列化的http响应作为执行回调的消息,并且响应完成后返回End方法异步操作?服务可以调用两次回调

谢谢!

编辑: 为了确保它们不会混淆,我不是要求使用双工合同进行回调,而是AsyncCallback通过如下合同传递(http://msdn.microsoft.com/en-us/library/ms731177.aspx ):

  [OperationContractAttribute(AsyncPattern=true)]
  IAsyncResult BeginServiceAsyncMethod(string msg, AsyncCallback callback, object asyncState);

  // Note: There is no OperationContractAttribute for the end method.
  string EndServiceAsyncMethod(IAsyncResult result);

3 个答案:

答案 0 :(得分:4)

使用HTTP协议的回调实现为复合双工通信(WS-DualHttpBidning)。这意味着双方在不同的交通连接上互相呼叫。当客户端调用服务时,它会发送HTTP请求。该服务处理请求并存储回调通道供以后使用。然后它返回HTTP响应,该响应仅确认发起请求。它不会触发回调。通过调用回调通道上的操作从服务触发回调。它创建从服务器发送到客户端的HTTP请求。客户端执行回调操作并将HTTP响应返回给服务器。

此通信流使用双向消息交换模式,但双工通信通常使用单向消息传递。服务器可以根据需要多次调用客户端回调(客户端的性能和非活动超时会影响这一点)。

复合双工通信要求客户端和服务器都可访问(双方的防火墙设置)。在HTTP客户端上公开自己的端点,其行为类似于另一个Web服务。相比之下,net.tcp具有全双工通信通道,因此服务器调用和回调cqll都在同一TCP连接上执行。

修改

抱歉,我不明白你的问题。异步操作(AsyncPattern)在服务器上实现 - 实现完全从客户端转移(由WCF服务体系结构包装)。客户端以通用HTTP请求/响应模式进行通信,并且服务可以仅为每个请求发送单个响应。

WCF支持两级异步处理 - 异步调用和异步操作。前者是在客户端实现的,服务不了解它,后者是在服务上实现的,客户端不知道它。这些方法通常组合在一些可能引起混淆的例子中。

每种方法都有自己的porpouse。异步调用允许非阻塞服务调用,其中客户端可以在服务处理请求时执行其他操作(UI不冻结)。异步操作是为了更好地扩展重度使用的服务。同步执行块WCF处理线程,直到执行完成,而异步执行允许将处理线程返回到线程池(因此它可以处理另一个请求),同时操作执行一些耗时的操作 - 通常是IO或网络通信。

答案 1 :(得分:2)

本质上,通信与服务器调用相同。 “客户端”基本上有一个带有回调契约的端点,以便“服务器”可以调用它。没有魔力。

答案 2 :(得分:1)

WCF客户端堆栈在从服务器接收HTTP响应时调用回调方法。正如Alex Lo所说,服务器没有注意到这一点 - 它甚至不知道客户端代码正在使用异步调用:它看到的只是一个HTTP请求。

我没有研究过血腥细节,但我想回调是在IO完成端口上进行的。