2012-01-28 150 views
0

WebService的代碼很簡單:ASP.NET Web服務與內部服務器錯誤(500)響應POST和GET請求

[WebMethod] 
[ScriptMethod(ResponseFormat = ResponseFormat.Json)] 
public void receiveOrder(string json) { 
    Context.Response.Write("ok"); 
} 

和jQuery的調用web服務如下:

$.ajax({ 
    type: "POST", 
    contentType: "application/json; charset=utf-8", 
    url: 'http://localhost:50730/GingerWeb.asmx/receiveOrder', 
    data: 'test', //JSON.stringify(webOrder), 
    dataType: "text", 
    success: function(data){ 
     if(data === "ok") 
      orderPlaced(); 
     } 
}); 

然而,鉻控制檯讀取挑釁性的紅色:

500(內部服務器錯誤)

+0

你的數據類型不應該是「json」嗎? – 2012-01-28 19:38:23

+0

我想通了。對於未來的搜索者,當您調用asmx頁面時出現的內置頁面顯示webservice需要特殊格式的xml文本,並且(在本例中)json作爲其中一個元素。 – lowerkey 2012-01-28 20:29:38

回答

1

問題是ASMX網絡服務需要在請求中找到全部輸入參數。如果在對服務器的請求中未找到至少一個輸入參數,則Web服務將失敗並顯示狀態碼500(內部服務器錯誤)。

原因是您以錯誤的方式發送數據。 Web方法的輸入參數的名稱是json(請參閱void receiveOrder(string json))。所以$.ajaxdata選項應該是形式

data: JSON.stringify({json: webOrder}) 

如果使用type: "POST",而不是你嘗試過data: JSON.stringify(webOrder)。在POST請求主體的情況下將是json=theVlue而不僅僅是theValue

,如果您使用type: "GET"data參數的格式應改爲

data: {json: JSON.stringify(webOrder)} 

dataType的值應該是「JSON」。更改後$.ajax應該工作。

此外,我建議您在url選項中使用相對路徑。我的意思是使用'/GingerWeb.asmx/receiveOrder'而不是'http://localhost:50730/GingerWeb.asmx/receiveOrder'。它會爲您節省same origin policy錯誤。

0

你好奧列格:你的解釋很簡單,並重點。我有一個類似的問題,你的解釋解決了。我提供了代碼片段來幫助「搜索者」瞭解我面臨的問題以及上述如何解決問題。總之,我從一個aspx頁面發佈一個簡單的jquery(.ajax)。我創建了一個web服務,從後端(緩存/數據庫)獲取一些數據,並返回相同的JSON格式。

JS代碼:

var parameters = "{'pageName':'" + sPage + "'}" 
var request = $.ajax({ 
    type: "POST", 
    url: "/NotificationWebService.asmx/GetNotification", 
    data: parameters, 
    contentType: "application/json; charset=utf-8", 
    dataType: "json" 
}); 

ASP.NET代碼的Web服務的背後

[WebMethod] 
[ScriptMethod(ResponseFormat = ResponseFormat.Json)] 
public string GetNotification(string pageName) 
{ 
    JavaScriptSerializer js = new JavaScriptSerializer(); 
    Notification ns = NotificationCache.GetActiveNotificationForPage(pageName); 
    if (ns != null) 
    { 
     NotificationJSData nJSData = new NotificationJSData(); 
     nJSData.Code = ns.Code; 
     nJSData.displayFreq = (short)ns.DisplayFreq; 
     nJSData.expiryDate = ns.ToDateStr; 

     return js.Serialize(nJSData); 
    } 
    return null;  
} 

這是絕對必要的,以確保您符合「頁面名稱」變量名在Web服務代碼指定什麼是在你的ajax請求的數據參數中發送的。我讓他們有所不同,並改變它是相同的,花了幾個小時後,我終於找到了正確的解決方案,感謝這篇文章。此外,在我的情況下,我只傳遞一個「名稱:值」對,所以我甚至不必使用一些json De-serialization函數來獲取值,上面的pageName只給出了值。

相關問題