手机站
网通分站
电信主站
密 码:
用户名:
当前位置 : 主页>网络编程>Asp.Net编程>列表

ASPX页Web服务调用性能优化

来源:互联网 作者:west263.com 时间:2008-02-22
西部数码-全国虚拟主机10强!40余项虚拟主机管理功能,全国领先!双线多线虚拟主机南北访问畅通无阻!免费赠送企业邮局,.CN域名,自助建站480元起,免费试用7天,满意再付款! P4主机租用799元/月.月付免压金!

  Windows XP 限制

  我们必须要注意,如果您在一个 Windows? XP 计算机上进行某项测试,则所面临的另一个限制是 XP Web 服务器对所允许的同时连接数的人为限制。因为 Windows XP 不是服务器平台,其同时连接数被限制为 10。这对于开发环境中的测试通常没问题,但是如果试图进行任何复杂的测试,该限制问题就会比较严重。本地计算机的连接不受此限制影响。

  真正的解决方案:异步请求处理

  调整配置设置是一种改善问题的方法,而在实际设计 Web 应用程序时通过某种方式彻底解决问题则是另一回事。等待阻塞的调用完成的线程永远也不会有更好的调整余地,因此,解决的办法是完全避免阻塞问题。异步处理请求就是一个适当的解决方案。这表现在两个方面:进行异步 Web 服务调用,以及在 ASP.NET Web 应用程序中异步处理请求。

  异步 Web 服务调用

  在以前的专栏中,我写了有关异步调用 Web 服务的问题。能够使线程不用等待 Web 服务调用完成是创建释放线程以便处理更多请求的异步页面处理模型的关键部分。此外,异步调用 Web 服务也比较简单。

  请考虑以下 ASPX 页面的 Visual Basic.NET 代码:

' 错用同步 Web 服务调用所造成的性能极差的
' 页面!
Public Class SyncPage
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
Label1.Text = proxy.Method1(500)
Label2.Text = proxy.Method1(200)
End Sub

End Class

  此代码非常易懂。页面加载时将创建一个 Web 服务代理实例,然后用该实例两次调用一个名为 Method1 的 Web 方法。Method1 只返回包含传递给该方法的输入参数的字符串。为了向该系统添加一定程度的延迟,Method1 在返回字符串之前还休眠了 3 秒钟。从调用返回到 Method1 的字符串被放在 ASPX 页面上的两个标签的文本中。该页面提供的性能极差,并且像一块海绵一样从进程线程池中吸取线程。由于在 Method1 Web 方法中有 3 秒钟的延迟,对该页面的一个调用至少要 6 秒钟才能完成。

  以下代码片段显示了一个类似 Web 页面的代码,只不过现在进行的是异步 Web 服务调用。

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, _

文章整理:西部数码--专业提供域名注册虚拟主机服务
http://www.west263.com
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!