4

我正在尝试创建一个支持异步调用的 WCF 服务。我遵循了我能找到的所有示例和教程,它们都具有一种同步方法的习惯模式,以及异步开始和结束,例如:

[OperationContract(AsyncPattern = false)]
string GetData(int value);

[OperationContract(AsyncPattern = true)]
IAsyncResult BeginGetData(int value, AsyncCallback callback, object asyncState);

string EndGetData(IAsyncResult result);

但是,无论我在客户端做什么,都只会调用同步的 GetData。Fiddler 告诉我消息总是一样的:

 <s:Envelope
 xmlns:s="http://schemas.xmlsoap.org/soap/envelope/"><s:Body><GetData
 xmlns="http://tempuri.org/"><value>0</value></GetData></s:Body></s:Envelope>

当我删除同步 GetData 接口时,现在可以正确调用 async 方法。

这是正常行为吗?我还应该做些什么来支持方法的同步和异步版本?

4

1 回答 1

6

这是一个普遍的误解。您假设您需要使服务器异步,以便客户端能够进行异步调用。这不是真的。服务器和客户端是 100% 独立的。它们由二进制有线协议分隔。

您在 Fiddler 中看到的消息总是相同的,因为 SOAP 对同步或异步一无所知。在 SOAP 级别,您的决定不会表现出来。出于这个原因,客户端也无法观察您的服务器端决策。

这意味着您可以让服务器同步,仍然有一个真正的异步客户端,或者相反。

无论如何,您应该只在服务器上实现一种模式:同步或异步。从不两者兼而有之。摆脱您的一种实现。从功能的角度来看,留下哪一个并不重要。

我从这里的评论中提取重要信息:

很难将有关何时使用服务器端异步的解释放入此评论框中。简而言之,默认情况下不要在服务器上使用它。如果特殊情况使其具有吸引力或必要性,请使用它。

在元级别上,让我指出异步 IO 已成为一种不应掉以轻心的时尚。社区现在处于非常不幸的错误信息状态。

于 2012-10-28T12:51:38.323 回答