0

我正在开发一个基于 ASP.NET MVC 3 的应用程序,并在尝试对控制器操作之一执行 Ajax POST(通过 jQuery)时看到间歇性问题。有时,控制器动作被调用得很好,代码按预期执行,但其他时候,控制器动作永远不会被调用,浏览器基本上挂在那里,直到请求最终超时。

这令人沮丧,因为我们无法始终如一地重现问题。另一方面,它发生得足够频繁,以至于我们通常可以不费力气就让它发生。我可以在 Firebug 的“Net”选项卡中看到浏览器肯定会发出 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 已执行,但我从未在控制器操作开始时到达断点;所以在途中的某个地方,球会掉下来。除了那些没有的时候,控制器动作执行没有问题。

4

1 回答 1

0

一种方法是使用“完成”而不是“成功”,当服务器返回 200 状态代码时会触发成功。每次请求完成时都会触发 Complete

$.ajax({
...
    complete: function(jqXHR, textStatus) {
       self.showUnsuccessfulSubmissionDialog(xhr.responseText);
    }
...
});
于 2012-12-21T22:12:01.567 回答