某些浏览器上AjaxPro中的ConnectFailure



本期已在PlayStation 3、4、Xbox360和Xbox One上转载。此问题存在于所有版本的AjaxPro中。

当发出Ajax请求(使用AjaxPro)时,服务器会返回正确的内容。但是,回调函数中返回的对象是

{
   "error": 
    {
     "Message":"","Type":"ConnectFailure","Status":200},"value":null,
     "request":
     {
       "method":"MethodName",
       "args":
       {
          "Argument1":"1111","Argument2":"2222"
       }
     },
    "context":null,"duration":18
   }
}

在我的情况下,我在使用带有https、TLS 1.2、带有p-256密钥交换的ECDHE_RSA和AES_256_GCM密码(IE11+、Chrome51+、Firefox49+。请在此处查看您的密码)的AjaxPro时也遇到了同样的错误。它在使用HMAC-SHA1密码的过时AES_256_CBC的情况下运行良好。

问题是XMLHttpRequest.statusText属性在服务器响应后为空(我真的不知道为什么),并且AjaxPro.Request.protype.doStateChange方法(AjaxPro/core.ashx文件)期望"OK"将响应视为有效:

var res = this.getEmptyRes();
if(this.xmlHttp.status == 200 && this.xmlHttp.statusText == "OK") {
    res = this.createResponse(res);
} else {
    res = this.createResponse(res, true);
    res.error = {Message:this.xmlHttp.statusText,Type:"ConnectFailure",Status:this.xmlHttp.status};
}

我最终决定覆盖AjaxPro.Request.protype.doStateChange方法,并允许this.xmlHttp.statusText.中有一个空值

我将此脚本添加到受影响的页面:

$(function() {
    if (typeof AjaxPro != 'undefined' && AjaxPro && AjaxPro.Request && AjaxPro.Request.prototype) {
        AjaxPro.Request.prototype.doStateChange = function () {
            this.onStateChanged(this.xmlHttp.readyState, this);
            if (this.xmlHttp.readyState != 4 || !this.isRunning) {
                return;
            }
            this.duration = new Date().getTime() - this.__start;
            if (this.timeoutTimer != null) {
                clearTimeout(this.timeoutTimer);
            }
            var res = this.getEmptyRes();
            if (this.xmlHttp.status == 200 && (this.xmlHttp.statusText == "OK" || !this.xmlHttp.statusText)) {
                res = this.createResponse(res);
            } else {
                res = this.createResponse(res, true);
                res.error = { Message: this.xmlHttp.statusText, Type: "ConnectFailure", Status: this.xmlHttp.status };
            }
            this.endRequest(res);
        };
    }
});

在此之前的所有答案的基础上,为了供其他人参考,在我们的情况下,我们将其追踪到HTTP2协议(注意,我们正在通过HTTPS进行测试;我不确定HTTP是否存在问题…)。
-当我们在浏览器中禁用HTTP2(或针对服务器上的IIS)时,AjaxPro调用工作正常
-然而,当使用HTTP2时,响应是普通的"200"而不是"200 OK",AjaxPro将其解释为故障

这个问题的提示在中

"Message":""

AjaxPro的core.ashx文件是使用core.js 生成的

在core.js中,以下代码负责在接收到服务器的响应时生成响应对象。

   if (this.xmlHttp.status == 200 && this.xmlHttp.statusText == "OK") {
        res = this.createResponse(res);
    } else {
        res = this.createResponse(res, true);
        res.error = { Message: this.xmlHttp.statusText, Type: "ConnectFailure", Status: this.xmlHttp.status };
    }

出于某种原因,已识别平台上的浏览器不会将xmlHttp.statusText返回为"OK"。相反,它是空的。这导致AjaxPro陷入"ConnectionFailure"子句。

相关内容

  • 没有找到相关文章

最新更新