当前位置: 首页 > 面试题库 >

jQuery Ajax发布参数有时不会在IE上发送

郭炳
2023-03-14
问题内容

我遇到的问题是,当我以极低的频率(<2%)使用jquery ajax
post时,post参数永远不会到达服务器。我确实在访问日志中看到了发帖请求。它似乎仅在IE上发生(我在日志中的7、8和9上已经观察到了)。

当我将呼叫从“发布”类型切换为“获取”类型时,问题就消失了。

有没有人见过这种奇怪的行为在IE?谢谢!

我已经在各种ajax调用中看到了这一点,但这是一个典型的例子:

var data= {
    "guess" : "m1",
    "eas" : "hello world"
};

$.ajax({
    url: "http://myco.com/ajaxcall.action",
    data: data,
    type : 'post',
    dataType: 'json',
    success: function(data) {},
    error: function() {}
});

更新 :传递“缓存:假”不能解决此问题。


问题答案:

我花了最后一周在自己的应用程序中查找了类似的问题(使用Dojo,而不是JQuery)。从您的描述和出现的频率来看,我想说的是同样的问题。

当浏览器和服务器之间使用HTTP持久连接时(默认行为),服务器可以随时关闭HTTP连接。当浏览器在服务器关闭连接的同时开始发送新请求时,这会造成一个非常小的计时漏洞。大多数浏览器将使用其他连接或打开新连接并重新发送请求。这是RFC
2616第8.1.4节中建议的行为:

客户端,服务器或代理可以随时关闭传输连接。例如,客户端可能已开始在服务器决定关闭“空闲”连接的同时发送新请求。从服务器的角度来看,连接在空闲时正在关闭,但是从客户端的角度来看,请求正在进行中。

这意味着客户端,服务器和代理必须能够从异步关闭事件中恢复。客户端软件应该重新打开传输连接并重新发送中止的请求序列,而无需用户干预,只要请求序列是幂等的(参见第9.1.2节)。

Internet Explorer 确实会 尝试在发生这种情况时重新发送该请求, 但是 当它恰好是POST时,它将通过发送标头(带有Content-
Length)而不发送实际数据来处理它。这是格式错误的请求,应始终导致HTTP错误(通常是在超时之后等待永远不会出现的数据)。

此错误被Microsoft记录为KB
895954(请参阅http://support.microsoft.com/kb/895954)。Microsoft首先在IE
6中发现了此错误。他们提供了一个修复程序,并且此后似乎包括IE 9在内的每个版本的IE都附带了此修复程序。此修复程序有两个问题:

  1. 默认情况下未激活此修复程序。您必须使用regedit创建一个真正奇怪的密钥才能激活此修复程序:HKEY_LOCAL_MACHINE \ Software \ Microsoft \ Internet Explorer \ Main \ FeatureControl \ FEATURE_SKIP_POST_RETRY_ON_INTERNETWRITEFILE_KB895954。

  2. 该修复程序并不能真正解决问题。“固定”行为是,当尝试发送请求时关闭连接时,它甚至不尝试重新发送请求。它只是将错误传递给javascript应用程序。

看来您必须在代码中添加错误处理程序,如果请求失败,则可以自己重新发布请求。我正在为我的应用程序研究此解决方案。我担心的是,我不确定如何确定我收到的错误是由于发送查询的尝试失败还是由于查询导致的从服务器发送回的某些错误引起的(在这种情况下,我不会想重新发送)。

我编写了一个C程序来模拟Web服务器,并显式关闭连接以查看浏览器如何处理它。我发现IE可以100%地重现错误行为,而Firefox,Safari和Chrome可以通过100%的时间正确地在另一个连接上重新发送POST来恢复。答案可能是“不要使用IE”。



 类似资料:
  • 问题内容: 我正在研究一个脚本,以使用jQuery异步加载一些图像。 这是加载图像的函数的代码片段- 我已经在Firefox,Webkit(Safari,Chrome)中对此进行了测试,并且可以正常工作。 图像位于服务器上的文件夹中,而我使用的是jQuery 1.3。 有任何想法吗? 问题答案: 解决此问题的简单方法是提供jQuery设置或或或任何其他可用的响应类型。 我遇到了同样的问题,但是在.

  • 下面的错误会不时弹出,但并不总是在同一个地方。不太清楚为什么。有线索吗?这里的完整代码:完整代码 文件“/users/davidkasapchuk/pycharmprojects/test/homedepotfridges.py”,第257行,在price=item.find_element_by_class_name('product-display-price')文件“/library/fra

  • 我有一个主干模型,我正试图销毁它,但没有随请求发送任何参数,因此服务器返回一个“Delete 404 not found”错误。 我承认我的结构有点奇怪,因为我正在根据项目是否已经在列表中创建/销毁它们。 销毁前

  • 由于验证器失败,我无法捕捉在尝试解码Jwt时发生错误的身份验证失败事件。我使用的是Spring Security 5.2.1。请注意,当我根本不在“authorization”头中传递令牌时,我会捕捉到授权失败事件。我想必须对spring配置进行一些额外的配置。 引发的异常: 审计的实施如下所述:https://www.baeldung.com/spring-boot-authentication

  • 在Azure中,我开发了一个函数(应用服务),当新的csv文件放入特定存储帐户时会触发该函数。该函数是在Azure中开发的,每次上传新的csv文件时都不会出现问题。但是考虑到CI/CD,我决定将我的开发过程从Azure迁移到Visual Studio(2017)。 代码在本地运行没有任何问题,但一旦我将代码发布到Azure(通过VSTS),挑战就开始了。当新的csv文件上传到存储帐户时,触发器似乎

  • 问题内容: 这是对API调用的原始请求: 该请求返回成功(2xx)响应。 现在,我尝试使用发送此请求: 一切对我来说看起来不错,我不太确定自己张贴的错误是什么导致400响应。 问题答案: 用于GET样式的URL参数,用于POST样式的正文信息。在请求中 同时 提供 两种 类型的信息是完全合法的,您的请求也可以这样做,但是您已经将URL参数编码为URL。 您的原始帖子虽然包含 JSON 数据。可以为