3

ちょっと難しい問題が出てきました。

ユーザーがキオスクでサイトをチェックアウトするときに領収書の印刷を許可する必要があるプロジェクトに取り組んでいます。ドライバーとフォーマットに関連する理由から、Word で COM オートメーションを使用してレシートの印刷を処理しています。このコードは、ローカル マシンで実行される Web サービスにまとめました。

計画は、単純な jQuery ajax 呼び出しをページ html に配置して、Web サービスを実行しているローカル マシンの URL にすることでした。この ajax 呼び出しには、注文の json オブジェクトが含まれており、Web サービスによって逆シリアル化され、出力されます。localhost を使用すると問題なく動作しますが、本番環境ではクロス ドメイン ajax 呼び出しルールに違反します。

Web サイトで実行されているコードは、印刷サービスを実行しているローカル Web サービスに接続できないため、プロキシは機能しません。Web を調べたところ、JSONP を使用すると解決できる可能性があることがわかりましたが、それを機能させる方法がわかりません。ほとんどのチュートリアルでは、単にデータを投稿するだけでなく、リモート データを取得しようとしていることを前提としています。印刷 Web サービスは void を返します。

JSONP で動作するように Web サービス (asmx) を構成するにはどうすればよいですか? また、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 のより単純な代替手段、または私が考えていなかった可能性のある他の解決策も同様に役立ちます。

4

1 に答える 1

8

JSONPscriptはセクションにタグを追加する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 呼び出しのもう 1 つの代替手段は、Flash を使用することです。

于 2010-01-07T20:41:19.070 に答える