gpt4 book ai didi

jQuery $.ajax 调用同步执行,而不是在调用 WCF 服务时并发执行

转载 作者:行者123 更新时间:2023-12-03 22:18:37 25 4
gpt4 key购买 nike

我有一个 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 session 锁定造成的。为了解决这个问题,我必须在源自 WCF 服务的调用的调用堆栈中的任何位置消除对 Session 的使用。此外,我将 AspNetCompatibilityRequirementsMode 设置为 AspNetCompatibilityRequirementsMode.NotAllowed,并在 web.config 的 serviceHostingEnvironment 元素中设置 aspNetCompatibilityEnabled="false"。

这导致 WCF 在尝试访问 Session 时抛出错误,我只是重构了每个实例,以便它们不依赖于 session 。之后,我的 WCF 调用开始并发运行,而不是同步运行。

最佳答案

如果您使用 ASP.NET,它们会在 Session 对象上使用读/写锁。这使得 AJAX 请求串行。

在 ASP.NET 中,您可以使用 IHttpHandler 实现 IReadOnlySessionState,这不会在 session 上放置读/写锁。但不确定您使用的是什么环境。

编辑 1

这篇文章似乎表明 WCF 服务不允许您灵活地解锁 session :

How to force an IIS hosted WCF or ASMX [webservice] to use session object readonly?

编辑2

设置一个不会锁定 Session 对象的 IHttpHandler。

Web.config

<configuration>
<connectionStrings>
</connectionStrings>
<system.web>
<compilation debug="true" targetFramework="4.0" />
</system.web>
<system.webServer>
<httpProtocol>
<customHeaders>
<add name="Access-Control-Allow-Origin" value="*" />
</customHeaders>
</httpProtocol>
<modules runAllManagedModulesForAllRequests="true" />
<handlers>
<add name="MyProvider" path="MyProvider.aspx" verb="*" type="MyNamespace.MyProvider" resourceType="Unspecified" />
</handlers>
</system.webServer>
</configuration>

MyProvider.cs

using System;
using System.Web;
using System.Web.SessionState;

namespace MyNamespace
{
public class MyProvider : IHttpHandler, IReadOnlySessionState
{
public bool IsReusable
{
get { return true; }
}

public void ProcessRequest(HttpContext context)
{
}
}
}

如果您想创建一个接收并返回 JSON 对象的提供程序,您可以为请求和响应创建类,然后可以像这样设置您的处理程序:

MyProvider.cs(处理 JSON 对象)

using System;
using System.Runtime.Serialization.Json;
using System.Web;
using System.Web.SessionState;

namespace TestWebsite
{
public class MyProvider : IHttpHandler, IReadOnlySessionState
{
public bool IsReusable
{
get { return true; }
}

public void ProcessRequest(HttpContext context)
{
var response = new Json.Response();
try
{
var requestSerializer = new DataContractJsonSerializer(typeof(Json.Request));
var request = (Json.Request)requestSerializer.ReadObject(context.Request.InputStream);

// ...
}
catch (Exception ex)
{
response.Error = ex.ToString();
}

try
{
var responseSerializer = new DataContractJsonSerializer(typeof(Json.Response));
context.Response.ContentType = "application/json";
responseSerializer.WriteObject(context.Response.OutputStream, response);
}
catch (Exception)
{
throw;
}
}
}
}

关于jQuery $.ajax 调用同步执行,而不是在调用 WCF 服务时并发执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13980870/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com