我正在尝试创建一个支持异步调用的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方法.
这是正常的行为吗?我还应该做些什么来支持方法的同步和异步版本吗?
这是一个普遍的误解.您假设您需要使服务器异步,以便客户端能够进行异步调用.这不是真的.服务器和客户端是100%独立的.它们由二进制线协议分隔.
您在Fiddler中看到的消息始终是相同的,因为SOAP不知道有关同步或异步的任何信息.在SOAP级别,您的决定不会表现出来.因此,客户端也无法观察到服务器端的决定.
这意味着您可以使服务器同步,但仍然具有真正的异步客户端,或者相反.
在任何情况下,您应该只在服务器上实现一种模式:同步或异步.从来没有.摆脱你的一个实现.从功能的角度来看,保留哪一个并不重要.
我从这里的评论中提取重要信息:
很难在这个评论框中找到关于何时使用服务器端异步的说明.简而言之,默认情况下不要在服务器上使用它.如果特殊情况使其具有吸引力或必要,请使用它.
在元级别上,让我指出异步IO已成为一种不应轻易遵循的时尚.现在社区处于非常不幸的状态.
| 归档时间: |
|
| 查看次数: |
1300 次 |
| 最近记录: |