2009-07-13 56 views
12

我看到類似的問題,但它並未解決我的問題。我在ASMX文件中有一個JSON Web服務;ASP.NET JSON Web服務始終返回包裝在XML中的JSON響應

的Web方法

 [WebMethod] 
     [ScriptMethod(ResponseFormat = ResponseFormat.Json)] 
     public string GetUserRoles(string JSONUserCode) 
     { 
      string retRoles = string.Empty; 
      List<JSONRole> roles = new List<JSONRole>(); 

      {... I Populate the roles here ...} 

      DataContractJsonSerializer serializer = new 
      DataContractJsonSerializer(roles.GetType()); 
      MemoryStream ms = new MemoryStream(); 
      serializer.WriteObject(ms, roles); 
      string jsonString = Encoding.Default.GetString(ms.ToArray()); 
      ms.Close(); 
      return jsonString; 
     } 

代碼這個正確正確的格式列表,但包裝在XML整個回報。這裏是迴應:

<?xml version="1.0" encoding="utf-8" ?> 
    <string xmlns="http://formshare.com/"> 
     [{"Name":"Accounts Payable"},{"Name":"Payroll"}] 
    </string> 

您可以點擊這個鏈接查看響應你的自我:

http://dev.formshare.gologictech.com/JSON/JSONService.asmx/GetUserRoles?JSONUserCode=1234

我需要的迴應只是:

[{"Name":"Accounts Payable"},{"Name":"Payroll"}] 

任何想法?謝謝你的幫助。

回答

11

WebMethod能夠提供與XML和JSON相同的信息。在提交請求時,您需要在客戶端指定您想要的格式(dataType)。

此外,您不應該手動將對象序列化爲JSON,而是返回角色,如果您的客戶端請求數據爲JSON,它將被序列化爲JSON。

編輯

jQuery的例子(注意dataType參數):

$.ajax({ 
    type: 'GET', 
    url: 'http://dev.formshare.gologictech.com/JSON/JSONService.asmx/GetUserRoles', 
    contentType: 'application/json; charset=utf-8', 
    dataType: 'json', 
    data: '{"JSONUserCode":"1234"}', 
    success: myCallback 
}); 

值得一提的是,對象也不會完全相同的格式,你指定的返回,而是裹在一個對象:

{ d: [ {"Name":"Accounts Payable"}, {"Name":"Payroll"} ] } 

但是,這實際上是相當理想的,for added security

+0

反正是有指定的POST數據類型? – JohnnyCantCode 2009-07-13 20:01:29

1

確保您的服務類具有[ScriptService]屬性。該屬性默認不添加。

1

嘗試Jayrock for .NET,它是.NET JSON RPC的整潔處理程序。它會做你需要的。 ASP .NET JSON RPC here有一步一步的操作方法。

0

我們做了另一個頁面調用服務服務器端並寫入響應(在我們的例子中爲.aspx)。我們清理了所有的HTML代碼,doctype頭部主體,並且讓服務器端代碼調用服務和response.write它。

(在ASPX情況下,剛剛離開頁面指​​令頂部)

這樣你可以得到一個乾淨的字符串。順便說一句,如果這是暴露我們的應用程序的任何安全威脅或重大性能命中,我真的很感激評論。 太忙了,在這裏問它或搜索:)

1

我犯了同樣的錯誤處理序列化我自己。你不應該返回字符串,而是對象本身。

如果您已經開發了這樣的一百種服務,爲您解決問題:剛創建了一個aspx,ServiceCaller.aspx,刪除html中的所有內容,只留下頁面指令並使用代碼隱藏來調用服務和響應寫下字符串。還可以將Service方法名稱作爲參數(如「HelloWorld」)並使用反射來調用它。

這是有點顯示你的右手的右耳,但它的作品。您還可以輕鬆地集成角色管理和使用反射獲取服務名稱作爲字符串檢查數據庫,如果用戶可以調用此服務並使用反射調用該方法。

(在這個任何意見都是歡迎的。

0

你只錯過了「靜態」的方法聲明關鍵字請看下面的它應該工作。

FYI:所有Web方法應該是靜態

[的WebMethod] [ScriptMethod(ResponseFormat = ResponseFormat.Json)]

public static string GetUserRoles(string JSONUserCode) 
    { 
     string retRoles = string.Empty; 
     List<JSONRole> roles = new List<JSONRole>(); 

     {... I Populate the roles here ...} 

     DataContractJsonSerializer serializer = new 
     DataContractJsonSerializer(roles.GetType()); 
     MemoryStream ms = new MemoryStream(); 
     serializer.WriteObject(ms, roles); 
     string jsonString = Encoding.Default.GetString(ms.ToArray()); 
     ms.Close(); 
     return jsonString; 
    } 
3

原來這不是數據類型,它管用的,但

contentType: 'application/json; charset=utf-8'. 

它像一個魅力工作。

0

而是在你的WebMethod使用返回一個字符串:

JavaScriptSerializer js = new JavaScriptSerializer(); 
Context.Response.Write(js.Serialize(YOUR_STRING_TO_OUTPUT)); 
相關問題