2012-12-21 62 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); 
    } 
... 
});