Jquery Ajax超时问题
我们有一个使用MVC/Knockout js构建的应用程序。在表单的末尾,当用户开始提交时,所有数据都被转换成json字符串,并通过Jquery.ajax发送给我们的控制器。一旦数据库提交完成(如果没有问题),它将执行任何验证,并返回字符串“done”。ajax回调将设置一个具有该完成状态的变量,并提交一个包含该状态的最终表单,如果状态字符串未作为“完成”传入,则将显示少数用户看到的错误消息 我的问题是,是否有人知道任何可能导致响应不返回“完成”以外的任何内容的边缘情况(不包括验证错误或elmah记录的任何异常)。验证步骤将抛出一个错误,该错误将在数据无效但尚未发生的任何点返回elmah(elmah记录了其他问题)。对于99%的用户来说,这是没有问题的,所以我试图找出我是否遗漏了一些边缘案例 下面是我的AJAX请求,数据是使用knockout插件knockout.mapping然后使用JSON.stringify构建的。我们听到的一个用户正在使用InternetExplorer11(我无法在我的副本中重现错误)。最初的超时时间是10秒,我们将其增加到30秒,这似乎有帮助(将其设置为1ms将返回一个空字符串)。调试该问题的最大问题之一是数据是匿名的,因此很难将错误与任何用户联系起来Jquery Ajax超时问题,jquery,ajax,knockout.js,internet-explorer-11,Jquery,Ajax,Knockout.js,Internet Explorer 11,我们有一个使用MVC/Knockout js构建的应用程序。在表单的末尾,当用户开始提交时,所有数据都被转换成json字符串,并通过Jquery.ajax发送给我们的控制器。一旦数据库提交完成(如果没有问题),它将执行任何验证,并返回字符串“done”。ajax回调将设置一个具有该完成状态的变量,并提交一个包含该状态的最终表单,如果状态字符串未作为“完成”传入,则将显示少数用户看到的错误消息 我的问题是,是否有人知道任何可能导致响应不返回“完成”以外的任何内容的边缘情况(不包括验证错误或elma
$.ajax({
url: util.baseUrl('/Survey/Form'),
type: "POST",
data: dataStr,
contentType: "application/json; charset=utf-8",
timeout: 30000
})
.done(function (status) {
if (status === "done") {
self.gotoDonePage(status);
} else {
self.gotoDonePage(status);
}
})
.fail(function (err) {
self.gotoDonePage(status);
})
.always(function () {
layoutSetup.hideSpinner();
});
数据是匿名的,所以我们只能看到它来自何处,其他什么都看不到。我遇到的问题是,表单提交是在这之后通过gotoDonePage方法直接完成的,它传递的状态不是“完成”。设置验证时,elmah将捕获所有错误或无效数据,但不会发生这些错误。我的理论是,返回的状态是一个空的空间,或者由于某些问题而有额外的空间。也可能是请求需要超过30秒才能完成,但根据我的经验,这似乎不太可能
gotoDonePage函数基本上是
self.gotoDonePage = function (status) {
var url = util.baseUrl('/Survey/Done');
var form = $('<form action="' + url + '" method="post">' +
'<input type="hidden" name="status" value="' + status + '" />' +
'<input type="hidden" name="surveyTypeCd" value="' + self.SchoolSurveyTypeCd() + '" />' +
'<input type="hidden" name="surveyName" value="' + self.SchoolSurveyNameTxt() + '" />' +
'<input type="hidden" name="schoolYear" value="' + self.SchoolYear() + '" />' +
'<input type="hidden" name="schoolName" value="' + $('#SchoolName').val() + '" />' +
'</form>');
$('body').append(form);
form.submit();
}
self.gotondepage=功能(状态){
var url=util.baseUrl('/Survey/Done');
变量形式=$('')+
'' +
'' +
'' +
'' +
'' +
'');
$('body')。追加(表格);
表单提交();
}
当返回“完成”页面时,只需使用一个简单的“if-else”来确定它是否得到了“done”字符串,如果没有,则显示消息。这可能有助于进一步澄清问题。当你说“可能导致这种情况的边缘案例”时,你永远不会说“这”是什么。用户得到了什么错误?他们看到错误页面了吗?最终的表单是提交的还是之前的错误?@JasonSpake抱歉,我添加了更多细节。基本问题是done没有返回回调,因此可以将其传递给该表单。调查/表格方法在C#中的工作方式是,任何验证问题或一般异常问题都记录到elmah,我可以看到。因此,如果除了“done”之外还返回了任何其他字符串,那么它都将被记录。我的理论是,这可能与他们的网络设置有关,或者甚至是一个非常慢的连接,这会扰乱返回结果。从我的研究中,我找不到任何能让我走到任何地方的东西。