2012-04-15 114 views
1

我試圖通過AJAX在WebForms應用程序中調用Web服務。

我的劇本看起來是這樣的:

$.post('UpdateServer.asmx/ProcessItem', 
    'itemId=' + $(this).text(), 
    function (result) { 
     alert(result); 
    }); 

我的web服務看起來是這樣的。

[WebService(Namespace = "http://tempuri.org/")] 
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)] 
[System.ComponentModel.ToolboxItem(false)] 
[System.Web.Script.Services.ScriptService] 
public class UpdateServer : System.Web.Services.WebService 
{ 
    [WebMethod] 
    public string ProcessItem(int itemId) 
    { 
     return new JavaScriptSerializer().Serialize(
      new { Success = true, Message = "Here I am!" }); 
    } 
} 

Web方法按預期的方式調用,並帶有預期的參數。然而,傳遞給我的成功函數(最後一個參數爲$ .post())的參數是文檔類型,並且不包含我期望的成功和消息成員。

什麼是魔術詞,以便我可以找回我期待的對象?

編輯

仔細觀察,我能找到我要找的如下數據:

result.childNodes [0] .childNodes [0]。數據: 「 { 「成功」:真實的, 「消息」: 「服務器更新成功!」}」

+0

你可以發佈該方法的實際http響應嗎?你可以使用chrome開發工具或者像fiddler這樣的工具記錄下來。 – 2012-04-15 21:08:36

+0

什麼是你收到的文件? – domoindal 2012-04-15 21:14:23

回答

2

你看到的是,隨着JSON端節點奇結構是因爲你沒有調用服務the necessary way to coax JSON out of ASMX ScriptServices,然後返回反正一個JSON字符串的原因。因此,最終結果是您要返回包含該JSON字符串的單個值的XML文檔。

你現在運行的兩個具體問題是,你是manually JSON serializing your return value,而你沒有調用內容類型爲application/json(.NET需要切換到JSON序列化響應)的服務。

一旦你修復了這些問題,你還會遇到一個「無效的JSON基元」錯誤due to the data parameter being URL encoded instead of a valid JSON string

得到它的工作,做到這一點的服務器端:

[ScriptService] 
public class UpdateServer : System.Web.Services.WebService 
{ 
    [WebMethod] 
    public object ProcessItem(int itemId) 
    { 
    return new { Success = true, Message = "Here I am!" }; 
    } 
} 

您還可以創建一個數據傳輸對象(又名視圖模型)返回,而不是使用匿名類型和object,如果你想。

順利拿到原始JSON出的是,這樣做對客戶端:

$.ajax({ 
    url: 'UpdateServer.asmx/ProcessItem', 
    type: 'post', 
    contentType: 'application/json', 
    data: '{"itemId":' + $(this).text() + '}', 
    success: function(result) { 
    // This will be { d: { Success: true, Message: "Here I am!" } }. 
    console.log(result); 
    } 
}); 

如果你有幾分鐘的時間,通過在jQuery for the ASP.NET developer通信部分職位讀取。隨着您繼續沿着這條道路前進,您會發現很多有用的信息。

注意:helmus左邊的鏈接是相關的。 2之間沒有什麼根本改變。0並介紹如何使用ASMX ScriptServices通過JSON進行通信。如果您對.NET中的這個問題採取真正尖端的方法感興趣,那麼ASP.NET Web API就是您的選擇。

+0

非常感謝@Dave,我已經編程了很多年,但對這些技術來說相當新穎。看起來有時'data'成員應該是'arg = value'格式,其他時間應該是JSON。我沒有在這裏找到一致性,正如你所看到的,這裏的其他答案不能澄清。當然,你的例子是完全正確的,並且效果很好。顯然,我需要花更多的時間來更好地理解它。 – 2012-04-16 01:38:09

+0

@JonathanWood:你需要在這裏傳遞JSON字符串的原因是因爲application/json的'contentType'設置指定傳入數據將採用JSON格式。如果沒有該設置,則URL編碼的鍵=值對將是適當的。但是,如果* request *也以JSON形式出現,那麼ASP.NET只會響應JSON,因此這不是一種選擇。 – 2012-04-16 13:13:47

0

這個屬性添加到您的ProcessItem方法:

[ScriptMethod(ResponseFormat = ResponseFormat.Json)] 
+0

這似乎沒有改變任何東西。 – 2012-04-15 21:11:54

+0

也許你需要明確指定$ .post調用的dataType參數爲「json」。 – Tuan 2012-04-15 21:28:27

0

請在您的$.post調用中更加明確。

$.ajax({ 
    type:'post', 
    url:'UpdateServer.asmx/ProcessItem', 
    data: {'itemId':$(this).text()} 
}).done(function (result) { 
     alert(result); 
}); 
+0

你爲什麼推薦這個?你覺得$ .post()有問題嗎? – 2012-04-15 21:26:00

+0

http://icewalker2g.wordpress.com/2011/05/08/avoid-jquery-post-or-jquery-get-if-possible-use-jquery-ajax-instead/ – 2012-04-15 21:28:00

+0

謝謝。也許我們應該避免$ .post()。但是上面的代碼對我來說有很多錯誤。誰會想到這個東西會如此敏感!?! – 2012-04-15 21:54:19