服务器端异步 Web 方法

web|服务器|异步

何时采用异步 Web 方法

在确定是否适合在您的应用程序中采用异步 Web 方法时,有几个问题需要考虑。首先,调用的 BeginXXX 函数必须返回一个 IAsyncResult 接口。IAsyncResult 是从多个异步 I/O 操作返回的,这些操作包括访问数据流、进行 Microsoft Windows 套接字调用、执行文件 I/O、与其他硬件设备交互、调用异步方法,当然也包括调用其他 Web 服务。您可以从这些异步操作中得到 IAsyncResult,以便从 BeginXXX 函数返回它。您也可以创建自己的类以实现 IAsyncResult 接口,但随后可能需要以某种方式包装前面提到的某个 I/O 操作。

对于前面提到的大多数异步操作,使用异步 Web 方法包装后端异步调用很有意义,可以使 Web 服务代码更有效。但使用委托进行异步方法调用时除外。委托会导致异步方法调用占用进程线程池中的某个线程。不幸的是,ASMX 处理程序为进入的请求提供服务时同样要使用这些线程。所以与对硬件或网络资源执行真正 I/O 操作的调用不同,使用委托的异步方法调用在执行时仍将占用其中一个进程线程。您也可以占用原来的线程,同步运行您的 Web 方法。

下面的示例显示了一个调用后端 Web 服务的异步 Web 方法。它已经使用 WebMethod 属性标识了 BeginGetAge 和 EndGetAge 方法,以便异步运行。此异步 Web 方法的代码调用名为 UserInfoQuery 的后端 Web 方法,以获得它需要返回的信息。对 UserInfoQuery 的调用被异步执行,并被传递到 AsyncCallback 函数,后者被传递到 BeginGetAge 方法。这将导致当后端请求完成时,调用内部回调函数。然后,回调函数将调用 EndGetAge 方法以完成请求。此示例中的代码比前面示例中的代码简单得多,并且还具有另外一个优点,即没有在与为中间层 Web 方法请求提供服务的相同线程池中启动后端处理。

[WebService]

public class GetMyInfo : System.Web.Services.WebService

{

[WebMethod]

public IAsyncResult BeginGetAge(AsyncCallback cb, Object state)

{

// 调用异步 Web 服务调用。

localhost.UserInfoQuery proxy

= new localhost.UserInfoQuery();

return proxy.BeginGetUserInfo("用户名",

cb,

proxy);

}

[WebMethod]

public int EndGetAge(IAsyncResult res)

{

localhost.UserInfoQuery proxy

= (localhost.UserInfoQuery)res.AsyncState;

int age = proxy.EndGetUserInfo(res).age;

// 在此对 Web 服务的结果进行其他

// 处理。

return age;

}

}

发生在 Web 方法中的最常见的 I/O 操作类型之一是对 SQL 数据库的调用。不幸的是,目前 Microsoft ADO.NET 尚未定义一个完好的异步调用机制;而只是将 SQL 调用包装到异步委托调用中对提高效率没有什么帮助。虽然有时可以选择缓存结果,但是也应当考虑使用 Microsoft SQL Server 2000 Web Services Toolkit(英文)将您的数据库发布为 Web 服务。这样您就可以利用 .NET Framework 中的支持,异步调用 Web 服务以查询或更新数据库。

通过 Web 服务调用访问 SQL 时,需要注意众多的后端资源。如果您使用了 TCP 套接字与 Unix 计算机通信,或者通过专用的数据库驱动程序访问其他一些可用的 SQL 平台,甚至具有使用 DCOM 访问的资源,您都可以考虑使用众多的 Web 服务工具包将这些资源发布为 Web 服务。

使用这种方法的优点之一是您可以利用客户端 Web 服务结构的优势,例如使用 .NET Framework 的异步 Web 服务调用。这样您将免费获得异步调用能力,而您的客户端访问机制会与异步 Web 方法高效率地配合工作。

使用异步 Web 方法聚合数据

现在,许多 Web 服务都访问后端的多个资源并为前端的 Web 服务聚合信息。尽管调用多个后端资源会增加异步 Web 方法模型的复杂性,但最终还是能够显著提高效率。

假设您的 Web 方法调用两个后端 Web 服务:服务 A 和服务 B。从您的 BeginXXX 函数,您可以异步调用服务 A 和服务 B。您应该向每个异步调用传递自己的回调函数。在从服务 A 和服务 B 接收到结果后,为触发 Web 方法的完成,您提供的回调函数将验证所有的请求都已完成,在返回的数据上进行所有的处理,然后调用传递到 BeginXXX 函数的回调函数。这将触发对 EndXXX 函数的调用,此函数的返回将导致异步 Web 方法的完成。

小结

异步 Web 方法在 ASP.NET Web 服务中提供了一个有效的机制,可以调用后端服务,而不会导致占用却不利用进程线程池中的宝贵线程。通过结合对后端资源的异步请求,服务器可以使用自己的 Web 方法使同时处理的请求数目达到最大。您应该考虑使用此方法开发高性能的 Web 服务应用程序。

时间: 2024-08-22 14:59:51

服务器端异步 Web 方法的相关文章

服务器端异步 Web 方法(一)

web|服务器|异步 摘要:Matt Powell 介绍了如何在服务器端使用异步 Web 方法,来创建高性能的 Microsoft ASP.NET Web 服务. 简介 在九月份的第三篇专栏(英文)中,我谈到了利用 Microsoft .NET Framework 的客户端功能通过 HTTP 异步调用 Web 服务的问题.这种调用 Web 服务的方法非常有用,使用时不必锁定您的应用程序或产生过多后台线程.现在我们了解一下在服务器端提供类似功能的异步 Web 方法.异步 Web 方法在编写 ISA

ASP.NET服务器端异步Web方法

asp.net|web|服务器|异步 摘要:Matt Powell 介绍了如何在服务器端使用异步 Web 方法,来创建高性能的 Microsoft ASP.NET Web 服务. 简介 在九月份的第三篇专栏(英文)中,我谈到了利用 Microsoft¡ .NET Framework 的客户端功能通过 HTTP 异步调用 Web 服务的问题.这种调用 Web 服务的方法非常有用,使用时不必锁定您的应用程序或产生过多后台线程.现在我们了解一下在服务器端提供类似功能的异步 Web 方法.异步 Web

服务器端异步 Web 方法(二)

web|服务器|异步 简单的异步 Web 方法 为举例说明异步 Web 方法,我从一个名为 LengthyProcedure 的简单同步 Web 方法开始,其代码如下所示.然后我们再看一看如何异步完成相同的任务.LengthyProcedure 只占用给定的毫秒数. [WebService] public class SyncWebService : System.Web.Services.WebService { [WebMethod] public string LengthyProcedu

简单的异步 Web 方法

web|异步 何时采用异步 Web 方法 在确定是否适合在您的应用程序中采用异步 Web 方法时,有几个问题需要考虑.首先,调用的 BeginXXX 函数必须返回一个 IAsyncResult 接口.IAsyncResult 是从多个异步 I/O 操作返回的,这些操作包括访问数据流.进行 Microsoft Windows 套接字调用.执行文件 I/O.与其他硬件设备交互.调用异步方法,当然也包括调用其他 Web 服务.您可以从这些异步操作中得到 IAsyncResult,以便从 BeginXX

何时采用异步 Web 方法

web|异步 记得在用asp得时候,经常用到javascript.比如验证表单,删除确认等.Asp.Net的是服务器端的,我们的javascript失去了应用的空间.不过经过一番摸索,其实Asp.Net使用javascript非常简单. 先介绍一下WebControl的Attributes属性.(HtmlControl差不多,不再重复),Attributes是获取与控件的属性不对应的任意特性(只用于呈现)的集合.举个例子,一个普通的表单控件<input type="button"

Matt Powell的《Server-Side 异步Web Methhods》

server|web|异步|异步 摘要:Matt Powell 介绍了如何在服务器端使用异步 Web 方法,来创建高性能的 Microsoft ASP.NET Web 服务. 简介 在九月份的第三篇专栏(英文)中,我谈到了利用 Microsoft? .NET Framework 的客户端功能通过 HTTP 异步调用 Web 服务的问题.这种调用 Web 服务的方法非常有用,使用时不必锁定您的应用程序或产生过多后台线程.现在我们了解一下在服务器端提供类似功能的异步 Web 方法.异步 Web 方法

Silverlight实例教程 - Validation服务器端异步数据验证

Silverlight 4 Validation验证实例系列 Silverlight实例教程 - Validation数据验证开篇 Silverlight实例教程 - Validation数据验证基础属性和事件 Silverlight实例教程 - Validation数据验证DataAnnotation机制和调试技巧 Silverlight实例教程 - Validation客户端同步数据验证 Silverlight实例教程 - Validation服务器端异步数据验证 Silverlight实例

php异步调用方法

php 异步调用方法 客户端与服务器端是通过HTTP协议进行连接通讯,客户端发起请求,服务器端接收到请求后执行处理,并返回处理结果. 有时服务器需要执行很耗时的操作,这个操作的结果并不需要返回给客户端.但因为php是同步执行的,所以客户端需要等待服务处理完才可以进行下一步. 因此对于耗时的操作适合异步执行,服务器接收到请求后,处理完客户端需要的数据就返回,再异步在服务器执行耗时的操作. 1.使用Ajax 与 img 标记 原理,服务器返回的html中插入Ajax 代码或 img 标记,img的s

JavaScript获取服务器端时间的方法_javascript技巧

用js做时间校正,获取本机时间,是存在bug的. 使用js也可获取到服务器时间,原理是使用 ajax请求,返回的头部信息就含有服务器端的时间信息,获取到就可以了.以下: 1.依赖jQuery 代码: function getServerDate(){ return new Date($.ajax({async: false}).getResponseHeader("Date")); } 以上函数返回的就是一个Date对象,注意在使用ajax时必须同步,要不然无法返回时间日期. 无需填写