コードビハインドファイルを使用して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" };
}
}
From ResponseFormatがJSONに設定されている場合でもWebServiceはXMLを返します :
リクエストがPOSTリクエストであり、GETではないことを確認してください。ScottGuthrieには 理由を説明する投稿 があります。
JQuery専用に書かれていますが、これも役立つ場合があります。
jQueryを使用してASP.NET JSON Webサービスを使用する
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}");
}
}
これはおそらく今では古いニュースですが、魔法は次のように思われます。
これらのピースが配置されていれば、GETリクエストは成功します。
HTTP POSTの場合
クライアント側で(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時間を費やす)、静的メソッドのJSON([ScriptMethod()]マーカー)を返すASPXファイルでPageMethodsを使用できますが、移動する場合は静的メソッドを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サービスに勝るものではないことがわかりました。