1

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

折腾了一下,发现AsyncPattern是用来做服务实现的,而不是接口异步的,也就是暴露给客户端的服务还是同步的。例如,假设一个名为BeginMethodand的异步对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的两种方法实际公开给客户端?

4

1 回答 1

2

您要达到的目的不是此设置的用途。您可以重新制作 WSDL,但这不是一个好方法。

您可以尝试其他消息传递选项,例如 OneWay 和 Duplex,以实现来自客户端的异步调用模式。请参阅MSDN: Juval Lowy 撰写的有关单向调用、回调和事件的知识。

有关OperationContractAttribute.AsyncPattern 属性的更多详细信息:

“客户端不受影响,因为服务器上的异步方法对是一个实现细节,不会影响操作的底层 Web 服务描述语言 (WSDL) 描述。这些方法对客户端显示为带有相关消息的单个操作。WCF 自动将入站消息路由到 Begin 方法,并将 End 调用的结果路由到出站消息。因此,客户端通道可以将方法对表示为单个同步操作或异步操作对。客户端表示在任何情况下都不会以任何方式影响服务器上的异步实现。”

“客户端合同可以使用 AsyncPattern 属性来指示客户端可以用来异步调用操作的异步方法对。通常,客户端应用程序使用 ServiceModel 元数据实用工具 (Svcutil.exe) 工具和 /async 选项来生成 Begin和 End 方法对,客户端可以使用它来异步调用操作“。【这个方法对BeginXXXX/EndXXXX是在客户端生成的】

于 2013-01-31T23:34:48.337 回答