摘要:matt powell 介绍了如何在服务器端使用异步 web 方法,来创建高性能的 microsoft asp.net web 服务。
简介
在九月份的第三篇专栏(英文)中,我谈到了利用 microsoft® .net framework 的客户端功能通过 http 异步调用 web 服务的问题。这种调用 web 服务的方法非常有用,使用时不必锁定您的应用程序或产生过多后台线程。现在我们了解一下在服务器端提供类似功能的异步 web 方法。异步 web 方法在编写 isapi 扩展方面具有与 hse_status_pending 方法类似的高性能,但不需要为管理自己的线程池编写代码,同时又具有以托管代码方式运行的所有优点。
首先我们考虑一下常规的同步 microsoft® asp.net web 方法。当您从同步 web 方法返回时,将发送对该方法的响应。如果需要较长的时间来完成请求,则处理请求的线程会一直被占用,直到方法调用结束。不幸的是,多数较长的调用是由较长的数据库查询或对另一个 web 服务的调用等事件引起的。例如,如果您调用数据库,当前线程会一直等待调用完成。线程无事可做,只是等待,直至听到查询的返回。当线程等待完成对 tcp 套接字或后端 web 服务的调用时,也会出现类似的问题。
让线程处于等待状态很不好,特别是在服务器的运行压力很大的情况下。等待中的线程不会进行任何有效工作,例如为其他请求提供服务。我们需要找到一种方法,能够在服务器上开始较长的后台进程,同时又能将当前线程返回到 asp.net 进程池。然后,当较长的后台进程完成时,我们调用一个回调函数,结束对请求的处理,并通过某种方式通知 asp.net 请求已完成。实际上,这种功能可由 asp.net 使用异步 web 方法提供。
异步 web 方法的工作原理
当您使用 web 方法编写典型的 asp.net web 服务时,microsoft® visual studio® .net 只是编译您的代码以创建程序集;当收到对其 web 方法的请求时,将调用该程序集。程序集本身并不知道关于 soap 的任何事情。因此,当您的应用程序首次启动时,asmx 处理程序必须反映您的程序集,以确定提供哪些 web 方法。对于常规的同步请求,这些操作都很简单:找出哪些方法具有关联的 webmethod 属性、基于 soapaction http 标头来设置调用正确方法的逻辑。
对于异步请求,在反映过程中,asmx 处理程序寻找具有某种签名并将签名识别为异步的 web 方法。该处理程序将寻找符合以下规则的方法对: