2012-10-28 64 views
4

我想创建一个支持异步调用的WCF服务。我跟所有的样品和教程我能找到,而他们都有一个同步的方法的习惯模式,以及异步的开始和结束,如:异步WCF

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

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

string EndGetData(IAsyncResult result); 

然而,只有同步的GetData被调用,不管我在客户端做什么。提琴手告诉我,该消息始终是相同的:

<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接口,异步方法现在被正确调用。

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

回答

5

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

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

这意味着你可以让服务器同步,仍然有一个真正的异步客户端,或其他方式。

在任何情况下,您应该只在服务器上执行一个模式:无论是同步还是异步。从来没有。摆脱你的一个实现。从功能角度来看,哪个人留下并不重要。

我从这里的评论拉起重要信息:

这是很难适应有关何时使用服务器端异步 这个评论框的解释。总之,不要在服务器上使用它,默认为 。如果特殊情况使其具有吸引力,或者需要使用 。

在元层面上,让我指出异步IO已经变成 一种不应该轻视的时尚。该社区现在处于一种非常不幸的错误信息状态。

+0

这与我在运行时看到的相符,只是我找到的所有代码示例都包含了所有这些示例代码。如果异步都在客户端,那么为什么还要在服务器端支持异步? –

+2

您正在查看的示例在服务器上也只有一个实现。他们可能在客户端都有,但在服务器上这是没有道理的。很难在此评论框中解释何时使用服务器端异步。总之,不要在服务器上默认使用它。如果特殊情况使其具有吸引力或必要性,请使用它在元层面上,让我指出异步IO已成为一种不应该轻视的时尚。社区现在处于一种非常不幸的错误信息状态。 – usr

+0

我必须在那里同意你的看法。我有时也会看到事情在SOA方式上完成,通过调用db调用可能会简单得多。 –