【问题标题】:XMLHttpRequest POST stuck at readyState 1 after several successive requests against IIS7+Windows 7 ProXMLHttpRequest POST 在针对 IIS7+Windows 7 Pro 的多次连续请求后停留在 readyState 1
【发布时间】:2010-02-04 20:08:29
【问题描述】:

我正在使用 JavaScript 将 textarea 更新实时发送回服务器。我的 HTML 页面使用单个 XMLHttpRequest 对象将数据异步 POST 到服务器。消息可能在每个 onKeyUp 事件中发送,但由于我只使用单个 XMLHttpRequest 对象,因此我仅在 readyState 为 0(未初始化)或 4(已加载)时通过 POST 来限制请求。

针对 Windows 2003 Server 上的 IIS6,一切正常。针对 Windows 7 Professional 上的 IIS7,如果我快速输入多个字符,我的 XMLHttpRequest 对象的 readyState 会卡在 1(已初始化)。

我可以输入的字符数从 3 到 20 左右不等。如果我重新加载页面,我可以再输入几个字符,直到我再次卡住。如果我打字慢,那么我可以在看到问题之前输入更多字符。 [这可能与 IIS7 的连接限制有关吗?]

另外,如果我使用 GET 而不是 POST,一切正常(除了 GET 不支持我需要发送的数据长度)。

这里是重要代码位的 sn-p。有人对这个问题有任何见解吗?提前致谢。

var _xml = getXmlHttpRequest();

function getXmlHttpRequest()
{
    if (window.XMLHttpRequest)
        return new XMLHttpRequest();
    else if (window.ActiveXObject)
        return new ActiveXObject("Microsoft.XMLHTTP");
    alert ("Upgrade your browser, Fool!");
    return null;
}

function postValue(value)
{   // sends the answer to the server for saving
    if (_xml.readyState == 4 || _xml.readyState == "0")
    {
        var params = "value=" + encodeURIComponent(value);
        _xml.open("post", "save.py", true);
        _xml.onreadystatechange = handlePostValue;
        _xml.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
        _xml.setRequestHeader("Content-Length", params.length);
        _xml.setRequestHeader("Connection", "close");
        _xml.send(params);
    }
}

【问题讨论】:

  • @Mike - 哪些浏览器会发生这种情况?
  • 很好的问题,凯夫。我认为这是独立于浏览器的,但事实并非如此。问题出现在: - Windows XP 上的 IE6 - Windows 7 上的 IE8 - Windows XP 上的 Google Chrome 1.0 - Windows 7 上的 Google Chrome 1.0 问题不会出现在: - Ubuntu 9.10 上的 Firefox 3.5.7(适用于 Ubuntu Canonical 1.0)这些结果让我非常惊讶。所以看起来只有某些浏览器到 Web 服务器的组合是有问题的。听起来我们到目前为止有很多线索,但我还没有解决方案:(
  • 我注意到在我的 Windows 7 机器上使用 Google App Engine 网络服务器发生了同样的问题,即使在我的 Windows XP 机器上运行相同的客户端和服务器代码工作正常。这让我觉得这与网络服务器无关。很可能是操作系统或计算机本身。

标签: javascript ajax iis-7 post xmlhttprequest


【解决方案1】:

我认为您需要为每个请求创建一个全新的 XMLHttpRequest 对象。

【讨论】:

  • 我已经看到它以两种方式完成,但我想知道它是否与发布有关。还有一个问题是为什么它可以在一个 Web 服务器 (IIS6) 而不是另一个 (IIS7) 上工作。尽管如此,这是一个有价值的建议。我会试一试,让你知道进展如何。谢谢!
  • 感谢您的建议,Pointy,但无论我是否为每个请求使用新的 XHR 对象,都会出现同样的问题。
【解决方案2】:

只是一个简短的附注...您不想要更好的逻辑来支持 ActiveX xmlHTTP 吗?

例如这些版本怎么样(按优先级降序排列)?

Msxml2.XMLHTTP.6.0
Msxml2.XMLHTTP.3.0
Msxml2.XMLHTTP
Microsoft.XMLHTTP

更新: 另一种选择...我知道(至少在过去)某些浏览器在 readyState 属性的初始化方面存在问题...由此它没有设置值。

改变这条线有帮助吗?

//was
if (_xml.readyState == 4 || _xml.readyState == "0")

//try this
if (typeof(_xml.readyState) == 'undefined' || 
    _xml.readyState == 4 || _xml.readyState == "0")

【讨论】:

  • 在大多数情况下,基线 Microsoft.XMLHTTPMsxml2.XMLHTTP.3.0 相同,但 Microsoft 更希望您使用命名空间 Msxml2。如果您需要该版本中的任何内容(如 XPath),您只需要嗅探6.0。可能没有。见blogs.msdn.com/xmlteam/archive/2006/10/23/…
  • 拥有最新最好的也没有什么坏处。我会试试看。
  • 我更改了脚本以获取最新版本。正如预期的那样,它对我的​​问题没有帮助,这也发生在使用正确 XMLHttpRequest 对象的 Google Chrome 上。
【解决方案3】:

我可以暂时跳过参数问题。我目前有 3 个表单参数要发送。我通过使用一个字符来划分它们,该字符显示哪个表单堆栈元素被命中,一个数字显示该 stac 的哪个部分被命中,一个布尔值用于另一个原因。

【讨论】:

    猜你喜欢
    • 2015-08-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-11
    • 2015-12-12
    • 2018-10-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多