2012-12-21 64 views
0

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

这很令人沮丧,因为我们不能始终如一地重现问题。另一方面,这经常发生,我们通常可以在不付出太多努力的情况下实现。我可以在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被执行但在控制器行动开始时我从未落在我的断点处的时候,所以在这个方向的某个地方,球落下了。除非那些时候没有,并且控制器动作毫不费力地执行。

+0

可以显示POST和服务器操作的代码吗? – rae1

+0

如果您使用的是IIS7,则可以考虑使用“失败的请求跟踪”来查看您可以找到的内容。 http://www.iis.net/learn/troubleshoot/using-failed-request-tracing/using-failed-request-tracing-rules-to-troubleshoot-application-request-routing-arr – HackedByChinese

+0

@ rae1n,I've添加了客户端POST和服务器端控制器操作的代码。 –

回答

0

一种方法是使用“complete”而不是“success”,当服务器返回200状态码时成功被触发。每当请求完成时,整个被触发

$.ajax({ 
... 
    complete: function(jqXHR, textStatus) { 
     self.showUnsuccessfulSubmissionDialog(xhr.responseText); 
    } 
... 
}); 
相关问题