1

我有一个 WebMethod,用于在初始加载后将一些 HTML 返回到页面中。该方法通过 jQuery 的 ajax 方法调用。

一切正常,但是,从这些调用加载请求状态时存在相当严重的性能问题。随着流量的增加,CPU 使用率会达到最大值,实际上会扼杀整个站点的响应能力。

使用一个分析器,System.Web.Handlers.ScriptModule.OnPostAcquireRequestState()被称为罪魁祸首,几乎 100% 的调用持续时间。

另一个分析器调用System.Web.HttpApplication.System.Web.IHttpAsyncHandler.BeginProcessRequest(HttpContext context, AsyncCallback cb, object extraData)

因此,我可以通过负载测试在本地重现该行为,但是对于库中的罪魁祸首,我不知道如何解决它。是否有任何“陷阱”会导致上下文恢复成本高昂?我可以简单地从 WebMethod 中删除上下文吗?

4

1 回答 1

2

事实证明,问题在于 Page 类中有 WebMethod。这迫使 WebMethod 加载 Session State,它在 Session 对象上有一个读/写锁。这迫使请求同步执行,排队等待锁打开的请求。

我无法强制页面中的 WebMethod 不加载 Session,甚至将其加载为只读。将 WebMethod 移动到它自己的 WebService 中允许这样做 - 并解决了问题。

这解决了进入 WebMethod 时 CPU 的“锁定”问题,并允许方法同时执行,极大地帮助了页面的加载时间。

于 2013-04-19T12:40:18.600 回答