1

重複の可能性:
Ajax クロスドメイン呼び出し

JSON 応答を返す Asp.Net コントローラー メソッドがあります。ただし、Jquery を使用して別のドメインから呼び出すことはできません$.getJSON(...){}

簡単なグーグル検索では、JSONP を使用する必要があることが示唆されています。質問は、JSON と JSONP の違いは何ですか? それはまた別の新しい用語ですか?また、JSONP が機能している場合、JSON を機能させることができないのはなぜですか? サーバー側のコードを変更するのが怖いので、これらの派手な JSONP を使用せずにプレーンな古い JSON を使用する方法はありますか?

4

3 に答える 3

5

JSONを使用してクロスドメインAJAX呼び出しを行うことはできません。JSONPを使用する必要があります。したがって、コントローラーアクションから通常のアクションを返す代わりに、JsonResultパラメーターとして渡されるコールバックでJSONをラップするカスタムアクションの結果を記述します。

public class JsonpResult : ActionResult
{
    private readonly object _obj;

    public JsonpResult(object obj)
    {
        _obj = obj;
    }

    public override void ExecuteResult(ControllerContext context)
    {
        var serializer = new JavaScriptSerializer();
        var callbackname = context.HttpContext.Request["callback"];
        var jsonp = string.Format("{0}({1})", callbackname, serializer.Serialize(_obj));
        var response = context.HttpContext.Response;
        response.ContentType = "application/json";
        response.Write(jsonp);
    }
}

次に、コントローラーアクションにこのカスタムアクションの結果を返させます。

public ActionResult SomeAction()
{
    var result = new[]
    {
        new { Id = 1, Name = "item 1" },
        new { Id = 2, Name = "item 2" },
        new { Id = 3, Name = "item 3" },
    };
    return new JsonpResult(balances);
}

これで、このアクションをクロスドメインで使用できます。

var url = "http://example.com/SomeController/SomeAction/";
$.getJSON(url + '?callback=?', function (data) {
    alert(data);
});
于 2012-09-25T06:10:36.210 に答える
0

追加のコールバック (値または名前) を使用してサーバーに関する情報を提供するように指示することによって許可するサイトを除いて、すべてのクロスドメイン サイトで jsonp を機能させることはできません。

他のサイトが提供されたコールバックを許可しない場合、それからは何も得られません。

于 2012-09-25T06:06:28.313 に答える
0
JSONP = JSON + PADDING 
      = additional JavaScript callback function wrapping the JSON content.

JavaScript では、すべての ajax リクエストには、このクロスドメイン ポリシーに従うべき基準があります。これにより、XMLHttpRequest オブジェクトが別のドメインのリソースを要求するのを防ぎます。

JSON は有効な JavaScript であるため、使用できません。JSONP は、コールバック関数を作成し、スクリプト タグを DOM に動的に追加することによって、リモート ドメインからデータを取得する方法として作成されました。スクリプト タグはロード時にコールバックを呼び出し、データはアプリケーションで使用できるようになります。

JSONP 対応のサーバーにリクエストを送信するには、サーバーが使用可能なレスポンスを作成できるように、サイトに関する情報を送信する必要があります。

于 2012-09-25T04:41:18.703 に答える