使用AsyncPattern = true在WCF中公开异步操作

时间:2013-01-31 17:43:18

标签: wcf

我正在研究使用WCF在服务器和客户端之间实现真正的异步通信的替代方案。当然,我已经碰到了AsyncPattern = true

经过一番烦恼后,我发现AsyncPattern用于使服务实现而非接口异步,即暴露给客户端的服务仍然是同步。例如,假设一个名为BeginMethodEndMethod的异步对,如下所示:

[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的两种方法实际暴露给客户?

1 个答案:

答案 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在客户端生成]