我正在开发基于ASP.NET MVC 3的应用程序,并在尝试对其中一个控制器操作执行Ajax POST(通过jQuery)时看到间歇性问题。有时,控制器操作被调用得很好并且代码按预期执行,但有时,控制器操作永远不会被调用,浏览器基本上会挂起,直到请求最终超时。
这令人沮丧,因为我们不能始终如一地重现这个问题。另一方面,它经常发生,我们通常可以在没有太多努力的情况下实现它。我可以在Firebug的“网络”标签中看到浏览器肯定会发出POST请求,我知道它正在点击正确的URL。我还没有做过的一件事,但我在其他地方看到的建议,就是在中间设置Fiddler以查看请求到达的程度。但是假设它使它成为Web服务器(IIS),那么调试它的下一步应该是什么?我没有强大的Windows / .NET / IIS背景,因此我不知道从哪里开始寻找。
更新
这是执行POST的jQuery代码:
var self = this;
var jsonData = foo.toJSONString();
$.ajax({
type: 'POST',
dataType: 'json',
url: '/MyController/AddFoo',
data: { foo: jsonData },
success: function (data) {
self.showSuccessfulSubmissionDialog();
},
error: function (xhr, textStatus, error) {
self.showUnsuccessfulSubmissionDialog(xhr.responseText);
}
});
这是控制器操作的C#代码:
[HttpPost]
[Authorize]
public JsonNetResult AddFoo(string foo)
{
var fooObject = JsonConvert.DeserializeObject<Foo>(foo, SerializerSettings);
try
{
// Do something with fooObject
}
catch (Exception ex)
{
var formattedString = ex.Message.Replace("\r\n", " ");
return BuildErrorResult("An error occured writing data to the server: " +
formattedString);
}
return BuildSuccessResult();
}
一些细节(特别是变量名称)已被更改,但其中的要点如下所示。同样如前所述,在这种“破坏”的情况下,Firebug声称POST已被执行,但我从未在控制器动作开始时在断点处降落;所以在某个地方,球会掉下来。除非那些时候没有,并且控制器动作没有任何问题。
答案 0 :(得分:0)
一种方法是使用“完成”而不是“成功”,当服务器返回200状态代码时会成功触发成功。每次请求完成时都会触发完成
$.ajax({
...
complete: function(jqXHR, textStatus) {
self.showUnsuccessfulSubmissionDialog(xhr.responseText);
}
...
});