我正在开发一个基于 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 已执行,但我从未在控制器操作开始时到达断点;所以在途中的某个地方,球会掉下来。除了那些没有的时候,控制器动作执行没有问题。