我正在研究使用WCF在服务器和客户端之间实现真正的异步通信的替代方案。当然,我已经碰到了AsyncPattern = true
。
经过一番烦恼后,我发现AsyncPattern
用于使服务实现而非接口异步,即暴露给客户端的服务仍然是同步。例如,假设一个名为BeginMethod
和EndMethod
的异步对,如下所示:
[ServiceContract]
interface IMyService
{
[OperationContract(AsyncPattern = true)]
IAsyncResult BeginMyMethod(...);
MyComplexResult EndMyMethod(...);
}
现在,从中生成的WSDL只会暴露一个名为MyMethod的方法:
<wsdl:portType name="IMyService">
<wsdl:operation name="MyMethod">
<wsdl:input wsaw:Action="http://tempuri.org/IMyService/MyMethod" message="tns:IMyService_MyMethod_InputMessage"/>
<wsdl:output wsaw:Action="http://tempuri.org/IMyService/MyMethodResponse" message="tns:IMyService_MyMethod_OutputMessage"/>
</wsdl:operation>
</wsdl:portType>
问题是,是否有任何配置会迫使WCF将APM的两种方法实际暴露给客户?
答案 0 :(得分:2)
您要实现的目标不是此设置的目的。您可以重新编写WSDL,但这不是一个好方法。
您可以尝试其他消息传递选项,例如OneWay和Duplex从客户端实现异步调用模式。见Juval Lowy的MSDN: What You Need To Know About One-Way Calls, Callbacks, And Events。
有关OperationContractAttribute.AsyncPattern Property的更多详情:
&#34;客户端保持不受影响,因为服务器上的异步方法对是一个实现细节,不会影响操作的基础Web服务描述语言(WSDL)描述。这些方法在客户端看来是具有相关消息的单个操作。 WCF自动将入站消息路由到Begin方法,并将End调用的结果路由到出站消息。因此,客户端通道可以将方法对表示为单个同步操作或异步操作对。在任何情况下,客户端表示都不会以任何方式影响服务器上的异步实现。&#34;
&#34;客户端契约可以使用AsyncPattern属性来指示客户端可以用来异步调用操作的异步方法对。 通常,客户端应用程序使用ServiceModel元数据实用工具(Svcutil.exe)工具和/ async选项生成Begin和End方法对,客户端可以使用它来异步调用操作&#34; 。 [此方法对BeginXXXX / EndXXXX在客户端生成]