Asp.net

從 ASMX 返回 JSON,並在 Javascript 中正確處理

  • November 4, 2016

我意識到這裡已經有很多類似的問題,但我無法弄清楚這一點。

我有一個 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上。您可以下載、編譯並驗證它是否有效。然後您可以將您的程式碼與我的程式碼進行比較並找到您的錯誤。

此致

引用自:https://stackoverflow.com/questions/3196569