2012-08-14 108 views
1

我正在開發一個移動設備的網站,它使用jQuery(v 1.7.2)將ajax調用到ASP.NET(v 2.0.50727)Web服務。jQuery ajax POST調用ASP.NET Web服務隨機失敗

該調用在95%的時間內正常工作,但會隨機失敗,返回500個內部服務器錯誤。在第一行代碼執行前(第一行寫入事件日誌),它在服務器端失敗。

我還沒有看到使用我記得的桌面瀏覽器的通話失敗,但我已經看到它使用iPad的足夠的失敗。我添加了

<browserCaps userAgentCacheKeyLength="256"> 

到Web服務的web.config文件,但這並沒有幫助。

的javascript:

'{"formURL":"fileName.xml", "rowNumber":"1"}' 

C#

[WebMethod(EnableSession = true)] 
[ScriptMethod(ResponseFormat = ResponseFormat.Json)] 
public string getImage(string formURL, string rowNumber) { 
    log("Retrieving image of form " + formURL); 
    string image = ""; 
    string username = /*retrieve username*/; 
    string password = /*retrieve password*/; 
    if (username != null && username != "") { 
    image = /*code to retrieve the image*/; 
    } 
    return image; 
} 

private void log(string message) { 
    EvLog.WriteToEventLog(DateTime.Now.ToString("MM:dd:yyyy H:mm:ss:fff") + Environment.NewLine + message, 10); 
} 

我發現的唯一的事情是有所幫助我,是:傳遞到Web服務

$.ajax({ 
    type: "POST", 
    url: serverURL + "/getImage", 
    data: '{"formURL":"' + url + '", "rowNumber":"'+rowNumber+'"}', 
    contentType: "application/json; charset=utf-8", 
    dataType: "json", 
    success: function (msg,textStatus, jqXHR) { 
    ... 
    }, error: function(xhr, ajaxOptions, thrownError) { 
    ... 
    } 
}).done(function(){ 
    console.log("getImage call is done"); 
}); 

示例數據當調用失敗時,因爲來自Web服務的響應頭包含「jsonerror:true」,儘管我沒有能夠確定它爲什麼會隨機失敗。

任何幫助表示讚賞!

+0

難道是它無法發送數據時它以某種方式包含無效的JSON?也許在文件名或rownumber中有一些無效的字符?將數據添加到變量中,例如:var data ='{「formURL」:''+ url +'「,」rowNumber「:」'+ rowNumber +'「}''然後添加一個'console.log(data)在ajax調用之前,它應該向您顯示您要在瀏覽器調試工具的conole輸出窗口中發送的數據。 Debugging工具內置於Chrome和IE(我認爲是F12熱鍵),而FF則需要安裝FireBug AddOn。 – Nope 2012-08-14 18:25:26

+0

除了下面的答案之外,你可以嘗試在ajax調用'traditional:true'中設置另一個設置。我們發現爲了發佈JSON而工作,但我們使用ASP.NET MVC3,但仍值得一試。 「傳統:真實」會導致「淺」序列化。在這裏看到更多的細節:http://api.jquery.com/jQuery.ajax/和http://api.jquery.com/jQuery.param/ – Nope 2012-08-14 18:32:44

+0

我有日誌聲明之前,ajax調用是看什麼它會在同一數據集上隨機失敗(多次調用使用相同的數據) – user1324855 2012-08-14 18:33:29

回答

0

假設它確實是一個JSON錯誤,我的第一個想法是傳遞給參數的數據是不正確的。

下面的行引用變量的內容,我認爲正在從別的地方裝入代碼:

data: '{"formURL":"' + url + '", "rowNumber":"'+rowNumber+'"}',

假設你已經確保ROWNUMBER是一個整數值和止跌」 t破壞它,可能是'url'變量破壞了你的JSON格式。這種情況發生的最簡單方法是,如果你在文件名中有一個非轉義的引號,特別是如果它在連接時比預期更早地關閉了你的參數值。

字符總是有可能不適用於字符集。您是否有觸發失敗的示例數據?提供的例子看起來不錯,乾淨,所以我假設它不是錯誤情況之一。

+0

服務器端的兩個參數都是字符串,但是轉義字符的聲音定義一些可能會混淆綁定的東西。 – Nope 2012-08-14 18:26:14

+0

奇怪的是,使用相同數據的調用將大致工作9/10次,然後失敗一次,然後再次開始工作。 但是提交數據的一個例子是 '{「formXML」:「20120807114859.xml」,「rowNumber」:「5」}' – user1324855 2012-08-14 18:29:28

+0

如果您的服務器拋出內部服務器錯誤500,請檢查錯誤日誌以瞭解是什麼導致它。 – 2012-08-14 18:31:23

0

不要以這種方式

data: '{"formURL":"' + url + '", "rowNumber":"'+rowNumber+'"}',

建立自己的數據,可引起畸形的JSON字符串。

取而代之的是透過JSON.stringify方法字符串化的JavaScript對象:

data: JSON.stringify({formUrl: url, rowNumber: rowNumber}),

JSON.stringify將盡一切工作爲你代表你的對象是有效的JSON字符串。

+0

現在測試它,看看它是否修正了 – user1324855 2012-08-14 18:32:29

+0

無論如何,把你的服務器代碼放入try-catch塊,並寫一個未被捕獲錯誤的日誌,以瞭解發生了什麼(當然,如果你還沒有這樣的機制)。 – 2012-08-14 18:34:29

+0

即使對JSON.stringify進行了更改,它仍然是隨機失敗的。改變它之後的第一次嘗試失敗了,但之後的調用已經起作用了。 – user1324855 2012-08-14 18:41:07