ASPX页Web服务调用性能优化(3)
点击次数:16 次 发布日期:2008-11-26 13:50:25 作者:源代码网
|
源代码网推荐 源代码网推荐 Public Class AsyncPage 源代码网推荐 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 源代码网推荐 "调用 Web 服务 源代码网推荐 Dim proxy As New localhost.Service1 源代码网推荐 Dim res As IAsyncResult 源代码网推荐 = proxy.BeginMethod1(500, Nothing, Nothing) 源代码网推荐 Dim res2 As IAsyncResult 源代码网推荐 = proxy.BeginMethod1(200, Nothing, Nothing) 源代码网推荐 Label1.Text = proxy.EndMethod1(res) 源代码网推荐 Label2.Text = proxy.EndMethod1(res2) 源代码网推荐 End Sub 源代码网推荐 源代码网推荐 End Class 源代码网推荐 源代码网推荐 同样,该页面将创建一个 Web 服务代理,然后两次调用 Method1 Web 方法。不同的是,现在调用的是 BeginMethod1,而不是直接调用 Method1。BeginMethod1 调用将立即返回,这样我们就可以开始第二次调用该方法。与第一个示例中等待第一个 Web 服务调用完成不同,现在我们可以同时开始这两个调用。对 EndMethod1 的调用只是在特定的调用完成前会造成阻塞。 源代码网推荐 源代码网推荐 值得注意的是,当我们从 ASPX 页面返回后,响应将发送给客户端。因此,在获得所需的数据之前,我们无法从 Page_Load 方法返回。这就是我们要阻塞 Web 服务调用直至其完成的原因。好的方面是两个调用可以同时执行,因此先前 6 秒钟的延迟现在将降到 3 秒钟左右。这虽然好一些,但仍然创建了阻塞的线程。我们真正需要的是在完成 Web 服务调用的同时,能够释放线程以便其处理 HTTP 请求。问题在于,ASPX 页面的处理模型没有一个异步执行模式。不过,ASP.NET 确实提供了一个解决此问题的方法。 源代码网推荐 源代码网推荐 异步 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 源代码网推荐 源代码网推荐 做人要厚道,请注明转自酷网动力(www.ASPCOOL.COM)。 源代码网推荐 源代码网供稿. |
