jQueryを使用してASMXWebサービスにJSONP呼び出しを行う方法を理解しようとしています。これらは私がすでに読んだページのほんの一部であり、解決策は見つかりませんでした。
jquery "jsonp"を使用して外部Webサービスを呼び出す方法は?
jQueryを使用してクロスドメインJSONをASP.NETに投稿する
JQueryを使用してASP.netWebサービスにアクセス中にエラーが発生しました-JSONP
jQuery.ajaxとJSONPでヘッダーを設定しますか?
http://www.codeproject.com/Articles/43038/Accessing-Remote-ASP-NET-Web-Services-Using-JSONP
http://encosia.com/using-jquery-to-consume-aspnet-json-web-services/
等...
これが私のサンプルの.NETWebメソッドです。
[WebMethod]
[ScriptMethod(UseHttpGet = true, ResponseFormat = ResponseFormat.Json)]
public void GetEmployee(string employeeId, string callback)
{
// Get the employee object from the Factory.
Employee requestedEmployee = EmployeeFactory.GetEmployee(employeeId);
if(requestedEmployee != null)
{
// Return the padded JSON to the caller.
CrossDomainUtility.SendJsonP(callback, requestedEmployee.ToJson());
}
}
SendJsonP()は次のとおりです。
public static void SendJsonP(string callback, string json)
{
// Clear any response that has already been prepared.
HttpContext.Current.Response.Clear();
// Set the content type to javascript, since we are technically returning Javascript code.
HttpContext.Current.Response.ContentType = "application/javascript";
// Create a function call by wrapping the JSON with the callback function name.
HttpContext.Current.Response.Write(String.Format("{0}({1})", callback, json));
// Complete this request, to prevent the ASMX web service from doing anything else.
HttpContext.Current.ApplicationInstance.CompleteRequest();
}
そしてここにいくつかのサンプルjqueryコードがあります:
$.ajax({
url: 'http://devserver/service/service.asmx/GetEmployee',
dataType: 'jsonp',
contentType: 'application/json',
data: { employeeId: '123456789' }
});
[ScriptService]で装飾されたWebサービスがあり、ScriptHandlerFactoryを使用して*.asmxを処理するようにweb.configを構成しています。
Content-Typeが'application/ json'の場合にASMXが使用する組み込みのJSONシリアル化を使用してみましたが、いくつかの問題があります。パディングをラップする必要があるため、JSONPでは機能しません。 .NETがサポートしていないJSON。また、JSONをシリアル化するためにASMXは「ContentType:application / json」ヘッダーを予期しているため、機能しませんが、jQueryはGETリクエストを送信するときにContentTypeヘッダーを無視します(おそらくコンテンツを送信していないため)。Global.asax Application_BeginRequest()でRequest.ContentType = "application / json"を設定しようとしましたが、何もしませんでした。また、beforeSend()を使用してjQueryでリクエストヘッダーを設定しようとしましたが、うまくいきませんでした。
そのため、組み込みの.NETパイプラインを使用して簡単に動作させることができなかったため、応答本文への生の書き込みを実行する独自の手法(したがって、SendJsonP()メソッド)を使用しました。GetEmployee()Webメソッドが値を返さない場合でも、ContentType of'アプリケーションを渡すことができないため、オブジェクトをXMLにシリアル化しようとしているため、.NETはシリアル化エラーをスローしているため、まだ問題があります。 /json'とGETリクエスト。
したがって、何をしてもjQueryにContentTypeを追加させることができないため、Fiddler2を使用して手動リクエストを作成するだけでWebサービスをテストしたいと思いました。
GET http://devserver/service/service.asmx/GetEmployee?callback=createMember&memberId=123456789
User-Agent: Fiddler
Content-Type: application/json
Host: devserver
...パラメータがJSONではないため、次のエラーが発生します。
{"Message":"Invalid JSON primitive: createMember [....] }
それで、結局、私はいくつかの質問を残されています:
組み込みの.NETシリアル化を使用してJSONにパディングを適用し、それをクライアントに返す方法はありますか?
自分でロールする必要があるようですが、パラメーターを含むJSONPクエリをASMXページに送信する場合、クエリ文字列はどのように表示されますか?JSON形式である必要がありますが、次のことを試したところ、「無効なJSONプリミティブ」エラーが発生しました。
GetEmployee?{callback: "createMember"、memberId: "99999999"}
GetEmployee?callback = {callback: "createMember"}&memberId = {memberId: "123456789"}
jQueryにJSONPGETリクエストでContentTypeヘッダーを送信させる方法はありますか?