异步WCF

Otá*_*cio 4 wcf asynchronous

我正在尝试创建一个支持异步调用的WCF服务.我按照我能找到的所有示例和教程,所有这些都有一个同步方法的惯用模式,以及async Begin和End,例如:

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

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

string EndGetData(IAsyncResult result);
Run Code Online (Sandbox Code Playgroud)

但是,无论我在客户端执行什么操作,都只会调用同步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>
Run Code Online (Sandbox Code Playgroud)

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

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

usr*_*usr 6

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

您在Fiddler中看到的消息始终是相同的,因为SOAP不知道有关同步或异步的任何信息.在SOAP级别,您的决定不会表现出来.因此,客户端也无法观察到服务器端的决定.

这意味着您可以使服务器同步,但仍然具有真正的异步客户端,或者相反.

在任何情况下,您应该只在服务器上实现一种模式:同步或异步.从来没有.摆脱你的一个实现.从功能的角度来看,保留哪一个并不重要.

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

很难在这个评论框中找到关于何时使用服务器端异步的说明.简而言之,默认情况下不要在服务器上使用它.如果特殊情况使其具有吸引力或必要,请使用它.

在元级别上,让我指出异步IO已成为一种不应轻易遵循的时尚.现在社区处于非常不幸的状态.

  • 您正在查看的示例肯定在服务器上只有一个实现.它们可能同时存在于客户端,但在服务器上却没有意义.很难在这个评论框中找到关于何时使用服务器端异步的说明.简而言之,默认情况下不要在服务器上使用它.如果特殊情况使其具有吸引力或必要,请使用它.在元级别上,让我指出异步IO已成为一种不应轻易遵循的时尚.现在社区处于非常不幸的状态. (2认同)