我有一个 Web 应用程序,其中包含一个页面,该页面上有一个包含数百个字段的表单。更改任何字段都会触发 jQuery $.ajax 回调到服务器以确定是否需要根据新值将任何其他字段添加到表单中。换句话说,当一个字段发生变化时,它会检查是否需要将任何依赖字段添加到表单中。
这个过程有点复杂,因此,有时这些检查可能需要几秒钟。
问题是,如果一个字段处于其 $.ajax 调用的中间,并且我在等待第一个字段完成时尝试更改另一个字段,则 UI 会被阻止并且我无法在页面上执行任何操作,直到第一次通话完成。就像 UI 一次只能处理一个 $.ajax 调用。这是 $.ajax 调用的副本:
$.ajax({
type: "POST",
async: true,
url: serviceUrl,
data: JSON.stringify(data),
contentType: "application/json; charset=utf-8",
dataType: "json",
processdata: true,
success: serviceSuccess,
error: serviceFailed
});
serviceSuccess
回调有很多复杂的代码来更新 UI,但是我删除了其中的所有代码,问题仍然存在。我认为这与回调没有任何关系,因为它似乎发生在调用完成之前,但为了确定,我试了一下。
有没有人用 jQuery $.ajax 听说过这样的事情?
编辑:我注意到从 $.ajax 调用返回的响应大小约为 130k。
编辑 2: $.ajax 调用正在调用 WCF 服务。类定义现在如下所示:
[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
public class ReviewDataService : IReviewDataService, IReadOnlySessionState
解决方案:所以 Jason 肯定为我指明了正确的方向。事实上,我的问题是由于 ASP.NET 会话锁定。为了解决这个问题,我必须从调用堆栈中的任何位置消除对源自我的 WCF 服务的调用的 Session 使用。此外,我将 AspNetCompatibilityRequirementsMode 设置为 AspNetCompatibilityRequirementsMode.NotAllowed 并在 web.config 的 serviceHostingEnvironment 元素中设置 aspNetCompatibilityEnabled="false"。
这导致 WCF 在尝试访问 Session 时抛出错误,并且我重构了这些实例中的每一个,以便它们不依赖于 session。之后,我的 WCF 调用开始并发运行,而不是同步运行。