2012-04-15 11 views
1

WebFormsアプリケーションでAJAX経由で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())に渡される引数はdocument型で、私が期待しているSuccessとMessageメンバーは含まれていません。

私が期待しているオブジェクトを取り戻せるように、魔法の言葉は何ですか?精密検査で

EDIT

、私は次のように私が探しているデータを見つけることができます: " :

result.childNodes [0] .childNodes [0] .dataのを{ "成功":真、 "メッセージ": "サーバーは正常に更新!"}」

+0

メソッドの実際のHTTP応答を投稿できますか?クロム開発ツールやフィドラーのようなツールでこれを記録することができます。 –

+0

あなたの文書として受け取ったものは何ですか? – domoindal

答えて

2

あなたがサービスthe necessary way to coax JSON out of ASMX ScriptServices呼び出した後、とにかくJSON文字列を返していないので、JSONで終わるノードの奇妙な構造であることを見ている理由。その結果、JSON文字列の単一の値を含むXMLドキュメントが返されます。

あなたが今に実行している2つの特定の問題は(.NETが応答をシリアル化JSONに切り替えるためにそれを必要とする)あなたはmanually JSON serializing your return valueだとあなたがapplication/jsonのコンテンツタイプとサービスを呼び出していないということです。

これらの問題を修正したら、「無効なJSONプリミティブ」エラーdue to the data parameter being URL encoded instead of a valid JSON stringも実行されます。また、あなたはしたい場合は、匿名型とobjectを使用する代わりに返すようにデータ転送オブジェクト(別名のViewModel)を作成することができ

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

それは、サーバー側でこれを行うには、作業を取得するには。成功したことのうち、生の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にあるはずです。私はここで一貫性を見つけるわけではありません。あなたが見ることができるように、ここの他の答えは明確にするためには機能しませんでした。もちろん、あなたの例はまさに正しいものです。明らかに、私はこれをよりよく理解するためにこれにもっと時間を費やす必要があります。 –

+0

@JonathanWood:ここでJSON文字列を渡す必要があるのは、 'application/json'の' contentType'設定が着信データがJSON形式であることを指定しているからです。この設定がないと、URLでエンコードされたkey = valueのペアが適切になります。しかし、* request *がJSONとしても提供される場合、ASP.NETはJSONで応答するだけなので、ここではオプションではありません。 –

0

があなたのProcessItemメソッドにこの属性を追加します。

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

これは何も変わっていないようです。 –

+0

$ .post呼び出しのdataTypeパラメータを "json"として明示的に指定する必要があるかもしれません。 – Tuan

0

$.postの呼び出しでは、より明示的になります。

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

なぜあなたはこれを推薦していますか? $ .post()に問題があると思いますか? –

+0

http://icewalker2g.wordpress.com/2011/05/08/avoid-jquery-post-or-jquery-get-if-possible-use-jquery-ajax-instead/ –

+0

ありがとうございます。たぶん$ .post()を避けるはずです。しかし、上記のコードにはいくつかのエラーがあります。誰がこの物がとてもかわいいと思ったでしょうか? –

関連する問題