技巧:服务器端异步 Web 方法

 在九月份的第三篇专栏(英文)中,我谈到了利用 Microsoftreg; .NET Framework 的客户端功能经过 HTTP 异步调用 Web 服务的问题。这种调用 Web 服务的方法很是有用,使用时没必要锁定您的应用程序或产生过多后台线程。如今咱们了解一下在服务器端提供相似功能的异步 Web 方法。异步 Web 方法在编写 ISAPI 扩展方面具备与 HSE_STATUS_PENDING 方法相似的高性能,但不须要为管理本身的线程池编写代码,同时又具备以托管代码方式运行的全部优势。 

首先咱们考虑一下常规的同步 Microsoftreg; ASP.NET Web 方法。当您从同步 Web 方法返回时,将发送对该方法的响应。若是须要较长的时间来完成请求,则处理请求的线程会一直被占用,直到方法调用结束。不幸的是,多数较长的调用是由较长的数据库查询或对另外一个 Web 服务的调用等事件引发的。例如,若是您调用数据库,当前线程会一直等待调用完成。线程无事可作,只是等待,直至听到查询的返回。当线程等待完成对 TCP 套接字或后端 Web 服务的调用时,也会出现相似的问题。 

让线程处于等待状态很很差,特别是在服务器的运行压力很大的状况下。等待中的线程不会进行任何有效工做,例如为其余请求提供服务。咱们须要找到一种方法,可以在服务器上开始较长的后台进程,同时又能将当前线程返回到 ASP.NET 进程池。而后,当较长的后台进程完成时,咱们调用一个回调函数,结束对请求的处理,并经过某种方式通知 ASP.NET 请求已完成。实际上,这种功能可由 ASP.NET 使用异步 Web 方法提供。 

异步 Web 方法的工做原理 
当您使用 Web 方法编写典型的 ASP.NET Web 服务时,Microsoftreg; Visual Studioreg; .Net 只是编译您的代码以建立程序集;当收到对其 Web 方法的请求时,将调用该程序集。程序集自己并不知道关于 SOAP 的任何事情。所以,当您的应用程序首次启动时,ASMX 处理程序必须反映您的程序集,以肯定提供哪些 Web 方法。对于常规的同步请求,这些操做都很简单:找出哪些方法具备关联的 WebMethod 属性、基于 SOAPAction HTTP 标头来设置调用正确方法的逻辑。 

对于异步请求,在反映过程当中,ASMX 处理程序寻找具备某种签名并将签名识别为异步的 Web 方法。该处理程序将寻找符合如下规则的方法对: 

BeginXXX 和 EndXXX Web 方法,其中 XXX 是任意字符串,表示要提供的方法的名称。 
BeginXXX 函数返回一个 IAsyncResult 接口,并分别接受 AsyncCallback 和一个对象,做为其最后两个输入参数。 

EndXXX 函数接受一个 IAsyncResult 接口,做为其惟一的参数。 
两个方法都必须使用 WebMethod 属性进行标识。 
若是 ASMX 处理程序发现两个方法符合上述全部条件,则将方法 XXX 做为常规的 Web 方法在其 WSDL 中提供。该方法将接受在 BeginXXX 的签名中的 AsyncCallback 参数以前定义的参数做为输入,并返回由 EndXXX 函数返回的内容。所以,若是某个 Web 方法具备以下同步声明:数据库

相关文章
相关标签/搜索