异步 PreRequestHandler 执行
ASP.NET 支持称为 HttpHandlers 的类。HttpHandlers 是实现 IHttpHandler 接口的类,用于为带有特定扩展名的文件的 HTTP 请求提供服务。例如,如果查看一下 Machine.config 文件,您将注意到,有许多 HttpHandlers 服务于带有扩展名(如 .asmx、.aspx、.ashx 甚至 .config)的文件的请求。对于带有特定扩展名的文件的请求,ASP.NET 将查看其配置信息,然后调用与其相关联的 HttpHandler 为该请求提供服务。
ASP.NET 还支持写事件处理程序,在处理 Http 请求过程中的各个时候都可以发生这类事件。其中一个事件是 PreRequestHandlerExecute 事件,它恰好发生在某个特定请求的 HttpHandler 被调用之前。还有一个对 PreRequestHandlerExecute 通知的异步支持,可以注册这些通知以使用 HttpApplication 类的 AddOnPreRequestHandlerExecuteAsync 方法。HttpApplication 类源自基于 Global.asax 文件创建的事件处理程序。我们将使用异步 PreRequestHandler 选项为 Web 服务调用提供异步执行模式。
在调用 AddOnPreRequestHandlerExecuteAsync 之前要做的第一件事是创建一个 BeginEventHandler 和一个 EndEventHandler 函数。请求传入后,将调用 BeginEventHandler 函数。我们将在此时开始异步 Web 服务调用。BeginEventHandler 必须返回一个 IAsyncResult 接口。如果您正在进行一个 Web 服务调用,则可以只返回由 Web 服务 begin 函数返回的 IAsyncResult 接口(在我们的示例中,将由 BeginMethod1 方法返回一个 IAsyncResult 接口)。在我创建的示例中,我想执行与前面的 Web 页面示例(其中揭示了同步和异步 Web 服务调用)相同的操作。这就意味着我必须创建自己的 IAsyncResult 接口。我的 BeginEventHandler 代码如下所示:
| Public Function BeginPreRequestHandlerExecute( ByVal sender As Object, _ ByVal e As EventArgs, _ ByVal cb As AsyncCallback, _ ByVal extraData As Object) As IAsyncResult If Request.Url.AbsolutePath _ = "/WebApp/PreRequestHandlerPage.ASPx" Then Dim proxy As MyProxy = New MyProxy proxy.Res = New MyAsyncResult proxy.Res.result1 = proxy.BeginMethod1( _ 500, _ New AsyncCallback(AddressOf MyCallback), _ proxy) proxy.Res.result2 = proxy.BeginMethod1( _ 300, _ New AsyncCallback(AddressOf MyCallback), _ proxy) proxy.Res.Callback = cb proxy.Res.State = extraData proxy.Res.Proxy = proxy Return proxy.Res End If Return New MyAsyncResult End Function |
| Public Sub MyCallback(ByVal ar As IAsyncResult) Dim proxy As MyProxy = ar.AsyncState If proxy.Res.IsCompleted Then proxy.Res.Callback.Invoke(proxy.Res) End If End Sub |
| Public Sub EndPreRequestHandlerExecute(ByVal ar As IAsyncResult) If Request.Url.AbsolutePath _ = "/WebApp/PreRequestHandlerPage.ASPx" Then Dim res As MyAsyncResult = ar Dim proxy As MyProxy = res.Proxy Dim retString As String retString = proxy.EndMethod1(proxy.Res.result1) Context.Items.Add("WebServiceResult1", retString) retString = proxy.EndMethod1(proxy.Res.result2) Context.Items.Add("WebServiceResult2", retString) End If End Sub |
| Public Class PreRequestHandlerPage Inherits System.Web.UI.Page Protected WithEvents Label1 As System.Web.UI.WebControls.Label Protected WithEvents Label2 As System.Web.UI.WebControls.Label Private Sub Page_Load(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles MyBase.Load Label1.Text = Context.Items("WebServiceResult1") Label2.Text = Context.Items("WebServiceResult2") End Sub End Class |


http://dev.xuezhishi.net/website/NET/2007-10-17/20782.html