与 XML Web services 进行异步通信

本主题专门介绍一项旧有技术。现在应通过使用以下链接来创建 XML Web 服务和 XML Web 服务客户端: Windows Communication Foundation.

与 Web 服务进行异步通信遵从 .NET Framework 指定的两种异步方法调用设计模式。但在讨论这些详细信息之前,有一点特别值得注意,那就是不必专门将 Web 服务编写为用来处理要异步调用的异步请求。

Wsdl.exe 和 .NET Framework 异步设计模式

Web 服务描述语言工具 (Wsdl.exe) 在生成用于访问指定的 Web 服务的客户端代理类时,它会为该代理类提供两种用于与每个 Web 服务方法进行异步通信的机制。第一种机制是 Begin/End 模式。第二种机制是 .NET Framework 2.0 版中提供的事件驱动的异步编程模式。有关将这些模式用于 Web 服务的简要说明,请参见以下几节。有关这两种模式的完整详细信息,请参见Asynchronous Programming Design Patterns

Begin/End 调用模式

Wsdl.exe 自动为 Web 服务中发布的每个操作(ASP.NET 中的 Web 服务方法)创建三种方法。一种方法用于同步访问;另外两种方法用于异步访问。即使只有一个 Web 服务方法的同步实现,也是如此。下表介绍了这三种方法:

代理类中的方法名 说明

<NameOfWebServiceMethod>

以同步方式为名为 <NameOfWebServiceMethod> 的 Web 服务方法发送消息。

Begin<NameOfWebServiceMethod>

与名为 <NameOfWebServiceMethod> 的 Web 服务方法开始异步消息通信。客户端指示 Begin 方法开始处理服务调用,但立即返回。返回值不属于 Web 服务方法指定的数据类型,而是属于实现 IAsyncResult 接口的类型。

End<NameOfWebServiceMethod>

结束与名为 <NameOfWebServiceMethod> 的 Web 服务方法之间的异步消息通信,并返回 Web 服务方法调用的结果值。

BeginEnd 方法遵循 .NET Framework 的异步设计模式的命名约定。设计模式断言,每种同步方法有两种这样命名的异步方法。

有关示例,请考虑 Web 服务类 PrimeFactorizer,它具有搜索质数因子的 Web 服务方法,同时具有以下签名:

public long[] Factorize(long factorizableNum)

此类方法完成处理所需的时间可能相对较长,具体取决于输入。因此,本应让 Web 服务客户端异步调用 Web 服务方法时,便是一个很好的示例。

如果 Wsdl.exe 使用此 Web 服务作为生成客户端代理代码(将 ?wsdl 查询字符串用于 ASP.NET Web 服务)的输入,则会生成具有下列签名的方法:

public long[] Factorize(long factorizableNum)
public System.IAsyncResult BeginFactorize(long factorizableNum, System.AsyncCallback callback, object asyncState)
public long[] EndFactorize(System.IAsyncResult asyncResult)

实现使用 Begin/End 模式进行异步方法调用的 Web 服务客户端

客户端如何知道何时调用 End 方法?根据 .NET Framework 的定义,有两种技术用来实现客户端,从而确定此时间:

  • 等待技术:使用 WaitHandle 类的方法之一使客户端等待方法完成。

  • 回调技术:将回调函数传入 Begin 方法,然后在方法完成处理后调用该方法,以检索结果。

**注意:**无论客户端选择上述两种技术当中的哪一种来与 Web 服务进行异步通信,发送和接收的 SOAP 消息都与通过同步代理方法生成的 SOAP 消息相同。也就是说,仍然只通过网络发送和接收一个 SOAP 请求和 SOAP 响应。代理类实现此目标的方法是,使用客户端用来调用 Begin 方法的线程之外的其他线程来处理 SOAP 响应。因此,客户端可以继续在其线程上执行其他工作,而代理类则处理 SOAP 响应的接收和处理。

使用 Begin/End 模式的等待技术

WaitHandle 类实现支持等待同步对象发出信号的方法:WaitOneWaitAnyWaitAll。同步对象发出信号表明,等待指定资源的线程随后可以访问该资源。Web 服务客户端通过 Begin 方法返回的 IAsyncResult 对象的 AsyncWaitHandle 属性来访问 WaitHandle 对象。

有关此技术的示例,请参见如何:使用等待技术实现异步 Web 服务客户端。

使用 Begin/End 模式的回调技术

在回调技术中,回调函数实现强制签名的 AsyncCallback 委托:

public void MethodName(IAsyncResult ar)

有关此技术的示例,请参见如何:使用回调技术实现异步 Web 服务客户端。

如果回调需要同步/线程关联上下文,则将通过上下文调度程序基础结构来调度回调。换句话说,回调可能与用于此类上下文的调用方异步执行。这是方法签名中的单向限定符的精确语义。这意味着,任何这样的方法调用都可以与调用方同步或异步执行,并且当执行控制返回给调用方时,调用方不能做出任何关于此类调用完成的假设。

在异步操作完成之前调用 End 方法将阻止调用方。使用 Begin 方法返回的同一 IAsyncResult 第二次调用该方法的行为不明确。

使用事件驱动的异步模式的异步 Web 服务客户端

Multithreaded Programming with the Event-based Asynchronous Pattern介绍一种新增的异步编程模型,该模型使用事件来处理回调,使得生成多线程应用程序更加容易,并且无需实现复杂的多线程代码本身。有关新增的事件驱动的异步模型的概述,请参见Event-based Asynchronous Pattern Overview。有关使用该新增模型的客户端实现的详细信息,请参见How to: Implement a Client of the Event-based Asynchronous Pattern

若要查看如何使用事件驱动的模式生成 Web 服务,请参见如何:使用 ASP.NET 2.0 实现事件驱动的异步 Web 服务客户端

另请参见

任务

如何:使用等待技术实现异步 Web 服务客户端
如何:使用回调技术实现异步 Web 服务客户端
如何:从 Web 服务客户端进行异步调用

概念

生成 XML Web services 客户端
使用 ASP.NET 创建的 XML Web services 的设计准则

其他资源

创建 XML Web services 客户端