2009-12-05 53 views
4

問題使用jQuery AJAX與總asp.net web服務轉到錯誤:不是成功:

我有jQuery代碼的aspx頁面超過一個ASMX Web服務文件發送一個Ajax請求(在同一網站)。返回的響應不一致,但是,它始終激發「錯誤」jQuery回調,而不是「成功」回調。狀態碼在200,12030和12031之間不一致。消息到回調的responseText在[blank]和json webservice返回的實際XML之間不一致。我調試了代碼,並且webservice實際上沒有任何例外地執行。

ASPX代碼

//代碼略去了

<script type="text/javascript"> 
jQuery(document).ready(function() 
{ 
    jQuery.ajax({ 
    type: "POST", 
    contentType: "application/json; charset=utf-8", 
    url: "CallDequeue.asmx/Dequeue", 
    data: "{}", 
    dataType: "json", 
    success: function(Msg) 
    { 
     alert('success:' + Msg.responseText); 
    }, 
    error: function(Msg) 
    { 
     alert('failed:' + Msg.status + ':' + Msg.responseText); 
    } 
    }); 
}); 
</script> 

//代碼ommitted爲簡潔

Web服務代碼

[WebService(Namespace = "http://tempuri.org/")] 
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)] 
[ScriptService] 
public class CallDequeue : System.Web.Services.WebService 
{ 
    [WebMethod] 
    public string Dequeue() 
    { 
    return "{\"d\":{\"FirstName\":\"Keivan\"}}"; 
    } 
} 

回答

4

當您將該服務標記爲ScriptService時,它會自動處理JSON序列化。您不應該手動序列化響應。

如果您希望返回爲「FirstName」,那麼您可以使用DTO類來控制語法。只要返回一個字符串,就會返回爲{'d':'Keivan'}而不是{'d':{'FirstName':'Keivan'}}。

[ScriptService] 
public class CallDequeue : System.Web.Services.WebService 
{ 
    public class PersonDTO 
    { 
    public string FirstName; 
    } 

    [WebMethod] 
    public PersonDTO Dequeue() 
    { 
    var p = new PersonDTO(); 

    p.FirstName = "Keivan"; 

    return p; 
    } 
} 

一些更改調用語法:

jQuery(document).ready(function() { 
    jQuery.ajax({ 
    type: "POST", 
    contentType: "application/json; charset=utf-8", 
    url: "CallDequeue.asmx/Dequeue", 
    data: "{}", 
    dataType: "json", 
    success: function(Msg) { 
     // Unless you're using 2.0, the data comes back wrapped 
     // in a .d object. 
     // 
     // This would just be Msg.d if you return a string instead 
     // of the DTO. 
     alert('success:' + Msg.d.FirstName); 
    }, 
    error: function(Msg) { 
     alert('failed:' + Msg.status + ':' + Msg.responseText); 
    } 
    }); 
}); 

您可以閱讀more about ASP.NET AJAX's .d wrapper here,如果你有興趣。

更新:

使用ASP.NET 2.0,您需要安裝the ASP.NET AJAX Extensions v1.0。此外,make sure your web.config is configured for ASP.NET AJAX(最具體地說是HttpHandlers部分)。

+0

我將Web服務代碼更改爲僅返回「Keivan」,並且它仍然調用error:callback,因爲響應以XML而不是JSON形式返回。這是一個.net 2.0網站。如何在返回字符串時使其返回純JSON? – 2009-12-05 21:02:23

+0

使用幾個步驟更新了答案,這些步驟是使JSON序列化工作在2.0中所必需的步驟。 – 2009-12-05 21:23:10

0

你說它是json,但它返回xml。我看到那裏有一點點脫節。

+1

對,因此當您在web服務上設置「ScriptService」屬性時,默認情況下,每個ScriptMethod上的響應會自動設置爲Response.Json。響應以XML包裝的JSON形式返回(不是通常返回的soap xml消息)。這回答了你的問題了嗎? – 2009-12-05 20:33:38

+0

這裏的問題是,如果你告訴jquery響應將以JSON格式發佈,但它確實是XML(其中一個元素包含帶有JSON的CDATA),那麼你就是在向jquery撒謊,並將其混淆。當你說JSON時,它期望整個響應體是JSON,句點。如果ajax請求實際上應該返回XML(如您所說),則需要使用適當的參數(s/json/xml /)進行設置,然後自己評估JSON數據。 – 2009-12-05 20:40:41

+0

那麼,如何讓我的web服務返回JSON而不被包裝在XML中?這是在ASP.NET 2.0中 – 2009-12-05 20:45:09

2

This問題很可能會幫助你。

否則,我將此Web服務轉換爲頁面方法,並立即生效。你有這個選擇嗎?

CS:

public partial class test : System.Web.UI.Page 
{ 
    protected void Page_Load(object sender, EventArgs e) 
    { 

    } 

    [WebMethod] 
    public static string Dequeue() 
    { 
     return "{\"d\":{\"FirstName\":\"Keivan\"}}"; 
    } 
} 

ASPX:

<script type="text/javascript"> 
    jQuery(document).ready(function() 
    { 
      jQuery.ajax({ 
      type: "POST", 
       contentType: "application/json; charset=utf-8", 
       url: "test.aspx/Dequeue", 
       data: "{}", 
       dataType: "json", 
       success: function(Msg) 
       { 
        alert('success:' + Msg.responseText); 
       }, 
       error: function(Msg) 
       { 
        alert('failed:' + Msg.status + ':' + Msg.responseText); 
       } 
      });  
    }); 

檢查this等Encosia文章出更多的信息。

0

這樣一個簡單的答案。我的網站。配置不是ajax啓用,所以所有的調用(不管我的web服務是一個腳本服務)是返回XML而不是純json。

+0

請更新您的問題,而不是添加答案。 – 2009-12-05 21:19:47

+0

嗨 我來到這裏後,近一年後再次繼續這個線程。我也遇到與在$ .ajax()中調用Web服務錯誤相同的問題。闡明我需要修改AJX的web.config文件。它是web服務web.config或網站的? 在我的情況下,我的網站不是一個asp.net網站。它只是一個驗證用戶的證書並且沒有附加web.config文件的表單。那麼我可以修改哪個文件。 提前致謝 – alienavatar 2010-08-25 15:14:16

0

嘗試標記了[ScriptMethod]

您的Web方法如:

[WebMethod] 
[ScriptMethod] 
0

我要感謝這裏所有的反應。

一定要在方法前加上這些屬性是必要的ScriptMethod時使用

[WebMethod] 
[ScriptMethod] 

不知道?

奇怪的是,他的下載代碼中沒有[Script Service][WebMethod]

無論如何,aJax 500 12030 12031錯誤在上述更改後消失。

相關問題