2011-01-30 115 views
3

我試圖從JavaScript使用jQuery使用ASMX Web服務。當我詢問XML時它工作正常,但我想利用.net的JSON序列化功能; (它也開始來煩我,這是不工作)ASP.NET Web服務錯誤地返回XML而不是JSON

Web服務的代碼:

using System; 
using System.Web; 
using System.Web.Services; 
using System.Web.Services.Protocols; 
using System.Web.Script.Services; 

[WebService()] 
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)] 
[ScriptService] 
public class SimpleService : WebService 
{ 
    [WebMethod] 
    public String GetString() 
    { 
     return "value"; 
    } 
} 

代碼客戶端:

$.ajax({ 
    type: "POST", 
    url: "SimpleService.asmx/GetString", 
    data: "{}", 
    contentType: "application/json; charset=utf-8", 
    dataType: "json" 
}); 

和響應.. 。

Content-Type: text/xml; charset=utf-8 
Server: Microsoft-IIS/7.5 
X-AspNet-Version: 2.0.50727 
X-Powered-By: ASP.NET 

<?xml version="1.0" encoding="utf-8"?><string xmlns="http://tempuri.org/">value</string> 

請求總是成功,但jQuery給了我一個解析器錯誤(不出意外,給出r esponse)。

我在我的智慧結束。我已經嘗試添加一個ServiceMethod屬性與ResponseType設置爲JSON,但似乎沒有任何工作。

我不想使用.NET ScriptManager JavaScript生成器,所以請不要使用它們。

回答

2

這一個是用戶錯誤。

我只是偶然發現了這個計算器的其他問題:web-service returning xml instead of json in net 4-0

類似的解決方案竟然是我所需要的。 web.config文件具有用於IIS6的ScriptHandlerFactory的httpHandler映射,並且我使用的是IIS7。將httpHandler映射添加到web.config的IIS7部分解決了問題。

我恨隱藏的移動部件....

0

嘗試添加[ScriptMethod]屬性的方法:

[WebMethod] 
[ScriptMethod(ResponseFormat = ResponseFormat.Json)] 
public String GetString() 
+1

我做到了。沒有運氣。 – 2011-01-30 09:10:48

3

沒有回答關於SO幫我解決這個問題。相反,我發現了兩篇文章描述了這個問題

jQuery不會將請求數據編碼爲JSON,而是編入查詢字符串中。這會導致ASP.NET忽略Accept標題並使用XML進行響應。

檢查this article標題爲「JSON,objects,and strings:oh my!」。

這裏我引用:

$.ajax({ 
    type: "POST", 
    url: "WebService.asmx/WebMethodName", 
    data: {'fname':'dave', 'lname':'ward'}, 
    contentType: "application/json; charset=utf-8", 
    dataType: "json" 
});

因爲該數據參數是一個有效的對象字面,調用Web服務這樣就不會扔在客戶端的任何JavaScript錯誤。不幸的是,它也不會有理想的結果。

fname=dave&lname=ward 

這顯然不是我們所希望發生的。解決的辦法是,以確保您傳遞的jQuery的字符串的數據參數,如:

$.ajax({ 
    type: "POST", 
    url: "WebService.asmx/WebMethodName", 
    data: "{'fname':'dave', 'lname':'ward'}", 
    contentType: "application/json; charset=utf-8", 
    dataType: "json" 
    });

它在語法的微小變化,但使所有的差異。現在,jQuery將單獨留下我們的JSON對象,並將整個字符串傳遞給ASP.NET以在服務器端解析。

在我的情況下,數據參數是一個大對象,所以我使用類似的東西將它序列化爲JSON manualy。

data: JSON.stringify({'fname':'dave', 'lname':'ward'}), 

獲得ASP.NET ScriptService返回JSON從jQuery的查詢時是非常棘手的,在你的代碼很多參數可以把它扔XML而不是JSON。你應該閱讀各種SO Q/A來讓自己滿意。

Related article form the same author可能會提供更多指導。