從 ASMX 返回 JSON,並在 Javascript 中正確處理
我意識到這裡已經有很多類似的問題,但我無法弄清楚這一點。
我有一個 Web 服務(C#、.net 3.5)。您需要了解的基本程式碼如下:
[WebService(Namespace = "http://tempuri.org/")] [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)] [System.Web.Script.Services.ScriptService] public class WSMember : System.Web.Services.WebService { public WSMember () { } [WebMethod] [ScriptMethod(UseHttpGet = true, ResponseFormat = ResponseFormat.Json)] public string GetMember(string IdMember) { //Ignore the parameter for now... I will be looking up a database with it... //For now just return a minimal object: Member m = new Member(); m.Surname = "Smith"; m.FirstName = "John"; return new JavaScriptSerializer().Serialize(m); }另外,在 web.config 中,我做了以下添加(我剛剛在其他文章中看到…這是正常/安全的嗎?)
<webServices> <protocols> <add name="HttpGet" /> <add name="HttpPost" /> </protocols> </webServices>然後在 Default.aspx 中,我的兩個關鍵引用…
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js"></script> <script type="text/javascript" src="jquery.json-2.2.min.js" ></script>jquery.json-2.2.min.js 是從Google程式碼下載的
這是Javascript:
<script type="text/javascript"> $(document).ready(function() { $("#button1").click(function(event) { var myData = { IdMember: "2" }; var encoded = $.toJSON(myData); alert(encoded); $.ajax({ type: "POST", url: "WSMember.asmx/GetMember", data: encoded, contentType: "application/json; charset=utf-8", dataType: "json", success: function(msg) { alert("worked" + msg.d); //$("#sidebar").append(msg); }, error: function(msg) { alert(msg.d); //$("#sidebar").append(msg); } }); }); }); </script>當我執行它時,編碼的 json 會按預期出現在消息框中……即帶有雙引號:
{ “IdMember”:“2” }
然而,它總是失敗。即使對於沒有傳入數據的最基本的 Hello World,它也會失敗。我不斷收到消息數據的“未定義”。
如果我只使用警報(味精),它會顯示
$$ object XMLHttpRequest $$ 有誰知道我的數據失去在哪裡?
還有一個問題……我在做什麼有什麼根本性的錯誤嗎?
非常感謝。
編輯:
謝謝大家的回复。我已經嘗試了以下…
UseHttpGet = true 現在更改為 false。(再次 - 我在某處看到它所以我嘗試了它……但我知道它不可能是正確的:-/)
假設 Web 服務現在返回一個字元串。我按如下方式建構字元串(似乎有點瘋狂……序列化它做了完全相同的事情……)
StringBuilder sb = new StringBuilder(); sb.Append("{"); sb.Append("\"Surname\":"); sb.Append("\""); sb.Append(m.Surname); sb.Append("\""); sb.Append(",\"FirstName\":"); sb.Append("\""); sb.Append(m.FirstName); sb.Append("\""); sb.Append("}"); return sb.ToString();此程式碼返回如下內容:
{"Surname":"Smith","FirstName":"John"}我仍然得到完全相同的錯誤……
我也嘗試過返回對象“成員”之類的方法,因此程式碼變為:
[WebMethod] [ScriptMethod(ResponseFormat = ResponseFormat.Json)] public Member GetMember(string IdMember) { Member m = new Member(); m.Surname = "Smith"; m.FirstName = "John"; return m; }這也會引發同樣的錯誤。
很抱歉很痛苦……我已經閱讀了這兩個連結和其他連結。只是不明白為什麼這有什麼不同。
是否有任何額外的配置設置我需要注意?
非常感謝您的回复。
更新: 問題已解決。上述程式碼中的主要錯誤是:
[ScriptMethod(UseHttpGet = true, ResponseFormat = ResponseFormat.Json)]應該
[ScriptMethod(ResponseFormat = ResponseFormat.Json)]此外,在表單上,當使用按鈕呼叫 javascript 時,我錯誤地設置了輸入類型……
<input id="button1" type="submit" value="Just a test" />當它應該說:
<input id="button1" type="button" value="Just a test" />非常感謝所有幫助過的人。
在我看來,您嘗試手動使用
JavaScriptSerializer().Serialize而不是返回對象的主要問題。來自 Web 服務的響應將採用雙 JSON 編碼。你說的對!有很多很接近的問題。如果 ContentType 不是 JSON,我可以從 .asmx Web 服務返回 JSON 嗎?並且Can’t get jQuery Ajax to parse JSON webservice result,你會(我希望)找到答案。
更新:抱歉,您在未發布的地方有一個小錯誤。為了解決這個問題,我用舊版本的 Visual Studio (VS2008) 創建了一個小項目,它幾乎完全符合您的程式碼並且可以工作。我把它放在http://www.ok-soft-gmbh.com/jQuery/WSMember.zip上。您可以下載、編譯並驗證它是否有效。然後您可以將您的程式碼與我的程式碼進行比較並找到您的錯誤。
此致