1

jsonp を使用して ashx ハンドラーを呼び出す方法の明確なウォークスルーを誰かに教えてもらえますか、または私が間違っていることを教えてもらえますか? あるサブドメインに JavaScript 関数があり、別のサブドメインで ashx ハンドラーを呼び出そうとしています。試してみると、ステータス 200 が返されますが、それでもエラー処理に入り、SyntaxError: Invalid character の throwError が報告されます。jquery と jsonp でいくつかのスレッドを見つけましたが、ashx に関連するコードを実際に示したスレッドは 1 つだけです。残念ながら、機能していないようで、その理由はわかりません。これは、javascript 呼び出しのコードと、ashx 応答です。

var sPay = getEl('chkPay').checked ? "pay=1" : "";
var sUrl = "/Calculator/GetCalcResult.ashx?jsoncallback=?" + sPay;

$.getJSON(sUrl, function (data) {
    console.log("Success:" + data);
}).error(function (xhr, ajaxOptions, thrownError) {
    console.log("Status:" + xhr.status);
    console.log("Error:" + thrownError);
});

そして、ashxハンドラー...

var jsonstr = 
                 "{\"calculatorresults\":{" +
                    "\"employees\" : \"" + employeeCount + "\"" +
                    "\"pay\" : \"" + calculationResult.PayTotal + "\"" +
                    "\"total\" : \"" + calculationResult.Total + "\"" +
                "}}";

            context.Response.ContentType = "application/json";
            context.Response.Write(string.Format("{0}({1});", context.Request["jsoncallback"], jsonstr));
4

1 に答える 1

3

私も最近これに苦労しました....これは、基本的な必要なコードを含む私のソリューションの非常に単純化されたバージョンです。

json を ashx ページに渡し、その ashx ページから json データを取得しようとすると、クロスドメインの問題が発生しました。この例では、SessionKey を ashx ページに送信し、オブジェクトの ID を返します。

クライアント ページからの JQuery AJAX 呼び出し:

function CallASHXPage()
{
    var strJson = '{ "Request": { "SessionKey": "ABCD-1234" } }';

    return $.ajax({
        url: "http://localhost:55724/RemoteJsonpTest.ashx?data=" + strJson,
        cache: false,
        crossDomain: true,
        dataType: "jsonp"
    }).done(function(data)
    {
        // handle the output here
        alert(data.Response.OutputID);
    });
}

ASHX ページのコードは次のとおりです。

// read in data param
string JSON = context.Request.QueryString["data"];

// execute your ASHX code here

// prepare resposne data
string strResponse = "{\n";
strResponse += "\t\"Response\":\n";
strResponse += "\t{\n";
strResponse += "\t\t\"OutputID\": "12345"\n";
strResponse += "\t}\n";
strResponse += "}\n";

// output response wrapped in callback function
string output = context.Request.Params["callback"];
output += "(" + strResponse + ");";
context.Response.Write(output);
于 2012-10-25T14:40:02.540 に答える