ASP.NETにjQueryを使ってクロスドメインJSONを投稿
質問
トリッキーな問題のガットの種類ます。
私たちは、ユーザーがキオスクで私たちのサイトでチェックアウトする際に領収書のプリントアウトを許可する必要があるプロジェクトに取り組んでいます。ドライバーとフォーマットに関する理由から、私は領収書をプリントアウト処理するためのWordでCOMオートメーションを使用しています。私は、ローカルマシン上で動作するWebサービスでは、このコードを上に包まれました。
計画は、Webサービスを実行しているローカルマシンのURLにページのHTMLに簡単なjQueryのAJAX呼び出しを入れていました。このAJAX呼び出しは、Webサービスによって非直列化され、プリントアウトされるため、のJSONオブジェクトが含まれています。私はlocalhostを使用している場合しかし、生産にノークロスドメインAjaxの呼び出しルールの抵触実行され、正常に動作します。
ウェブサイト上で実行されているコードは、印刷サービスを実行しているローカルのWebサービスに接続できないので、プロキシが動作しません。ウェブ上でチャンスをうかがった後、私はJSONPを使用すると、これに対する解決策かもしれませんが、私はそれを動作させる方法を見つけ出すことができないことを発見しました。ほとんどのチュートリアルはあなたには、いくつかのリモートのデータだけではなく、単に投稿データを取得しようとしていることを前提としています。印刷Webサービスはvoidを返す。
私は自分のWebサービス(ASMX)JSONPで動作するように設定するのです、私のjQueryのコードが好きなものに見えるだろうか?現在、それは次のようになります。
function printReceipt(data) {
$.ajax({
type: "POST",
url: "http://192.9.200.165/ContestWebService/Service1.asmx/PrintOrderReceiptJson",
data: data,
dataType: "json",
contentType: "application/json; charset=utf-8",
error: function(xhr, msg) { alert(xhr.statusText); }
});
}
JSONP、または私も参考になると考えられていない可能性があり、他の可能な解決策にどれ単純な代替。
解決
JSONPは単にscript
セクションにhead
タグを追加し、これだけの要求をGETに限定されています。 JSONPを処理するために、あなたのASMX Webサービスを設定するためには、手動でシリアライズを処理する必要があります。
[WebMethod]
[ScriptMethod(UseHttpGet=true, ResponseFormat=ResponseFormat.Json)]
public string Foo()
{
var json = new JavaScriptSerializer().Serialize(new
{
Prop1 = "some property",
});
string jsoncallback = HttpContext.Current.Request["jsoncallback"];
return string.Format("{0}({1})", jsoncallback, json);
}
とクライアント側ます:
$.getJSON("http://192.9.200.165/ContestWebService/Service1.asmx/PrintOrderReceiptJson?jsoncallback=?",
function(data) {
alert(data);
});
AJAX呼び出しクロスドメインのための別の方法としては、フラッシュを使用することです。