質問
コードビハインドファイルで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" };
}
}
解決
リクエストが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サービスに勝るものではないことがわかりました。