質問

コードビハインドファイルで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" };
    }
}
役に立ちましたか?

解決

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

  

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

     

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

他のヒント

純粋なJSON文字列をXMLにラップせずに受け取るには、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}");
        }
    }

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

  • 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);
            }
        });

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

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

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

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

'application / json; charset = utf-8 '

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

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

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top