我有一个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中删除上下文吗?
答案 0 :(得分:2)
事实证明问题是在Page类中有WebMethod。这迫使WebMethod使用会话状态加载,会话状态在Session对象上具有读取器/写入器锁。这迫使请求执行同步,对等待锁打开的请求进行排队。
我无法强制页面中的WebMethod不加载Session,甚至不能将其加载为只读。将WebMethod移动到自己的WebService中允许这样做 - 并解决了问题。
这解决了进入WebMethod时CPU'锁定'的问题,并允许这些方法同时执行,大大有助于页面的加载时间。