web-dev-qa-db-ja.com

ASMXファイルにJSONを出力させる方法

コードビハインドファイルを使用してASMXファイルを作成しました。正常に機能していますが、XMLを出力しています。

ただし、JSONを出力するために必要です。 ResponseFormat構成が機能していないようです。私の分離コードは:

[System.Web.Script.Services.ScriptService]
public class _default : System.Web.Services.WebService {
    [WebMethod]
    [ScriptMethod(UseHttpGet = true,ResponseFormat = ResponseFormat.Json)]
    public string[] UserDetails()
    {
        return new string[] { "abc", "def" };
    }
}
62
doekman

From ResponseFormatがJSONに設定されている場合でもWebServiceはXMLを返します

リクエストがPOSTリクエストであり、GETではないことを確認してください。ScottGuthrieには 理由を説明する投稿 があります。

JQuery専用に書かれていますが、これも役立つ場合があります。
jQueryを使用してASP.NET JSON Webサービスを使用する

39
Pavel Chuchuva

XMLにラップされずに純粋なJSON文字列を受け取るには、JSON文字列をHttpResponseに直接書き込み、WebMethod戻り値の型をvoidに変更する必要があります。

    [System.Web.Script.Services.ScriptService]
    public class WebServiceClass : System.Web.Services.WebService {
        [WebMethod]
        public void WebMethodName()
        {
            HttpContext.Current.Response.Write("{property: value}");
        }
    }
53
iCorrect

これはおそらく今では古いニュースですが、魔法は次のように思われます。

  • Webサービスクラスの[ScriptService]属性
  • メソッドの[ScriptMethod(UseHttpGet = true、ResponseFormat = ResponseFormat.Json)]
  • コンテンツタイプ:リクエストのapplication/json

これらのピースが配置されていれば、GETリクエストは成功します。

HTTP POSTの場合

  • メソッドの[ScriptMethod(UseHttpGet = false、ResponseFormat = ResponseFormat.Json)]

クライアント側で(webmethodがMethodNameと呼ばれ、searchStringと呼ばれる単一のパラメーターをとると仮定します):

        $.ajax({
            url: "MyWebService.asmx/MethodName",
            type: "POST",
            contentType: "application/json",
            data: JSON.stringify({ searchString: q }),
            success: function (response) {                  
            },
            error: function (jqXHR, textStatus, errorThrown) {
                alert(textStatus + ": " + jqXHR.responseText);
            }
        });
15
marc

私が難しい方法を学んだ簡単な落とし穴(基本的にGoogleで4時間を費やす)、静的メソッドのJSON([ScriptMethod()]マーカー)を返すASPXファイルでPageMethodsを使用できますが、移動する場合は静的メソッドをasmxファイルに追加する場合、静的メソッドにすることはできません。

また、呼び出しからJSONを取得するには、WebサービスのContent-Type:application/jsonに通知する必要があります(jQueryを使用しており、 jQueryの使用時に避けるべき3つの間違い の記事は非常に啓発-別の回答で言及されている同じウェブサイトからのもの)。

9
Bryan Rehbein

クライアントスクリプトから、またはサーバー側でWebサービスを呼び出していますか?

コンテンツタイプヘッダーをサーバーに送信すると役立つ場合があります。

'application/json; charset = utf-8 '

クライアント側では、プロトタイプのクライアント側ライブラリを使用します。これを指定できるAjax呼び出しを行うときはcontentTypeパラメーターがあります。 jQueryにはgetJSONメソッドがあると思います。

4
bitsprint

別の方法:汎用HTTPハンドラー(.ashx)を使用し、お気に入りのjsonライブラリーを使用して、JSONを手動でシリアル化および逆シリアル化します。

要求の処理と応答の生成を完全に制御できることが、.NETが提供する、シンプルでRESTfulなWebサービスに勝るものではないことがわかりました。

3
Kevin