次の方法で共有


JSONP の使用

JSON Padding (JSONP) は、Web ブラウザーでのクロスサイト スクリプティングのサポートを可能にするメカニズムです。 JSONP は、現在読み込まれているドキュメントの取得元とは異なるサイトからスクリプトを読み込む Web ブラウザーの機能を中心に設計されています。 このメカニズムは、次の例に示すように、JSON ペイロードにユーザー定義のコールバック関数名を埋め込むことで機能します。

callback({"a" = \\"b\\"});

前の例では、json ペイロード {"a" = \\"b\\"}は、 callback関数呼び出しでラップされています。 コールバック関数は、現在の Web ページで既に定義されている必要があります。 JSONP 応答のコンテンツ タイプは application/javascript

JSONP は自動的に有効になりません。 これを有効にするには、次の例に示すように、javascriptCallbackEnabled属性をいずれかの HTTP 標準エンドポイント (true または WebHttpEndpoint) でWebScriptEndpointするように設定します。

<system.serviceModel>
  <standardEndpoints>
    <webHttpEndpoint>
      <standardEndpoint name="" javascriptCallbackEnabled="true"/>
    </webHttpEndpoint>
  </standardEndpoints>
</system.serviceModel>

コールバック関数の名前は、次の URL に示すように、callback と呼ばれるクエリ変数で指定できます。

http://baseaddress/Service/RestService?callback=functionName

呼び出されると、サービスは次のような応答を送信します。

functionName({"root":"Something"});

次の例に示すように、 JavascriptCallbackBehaviorAttribute をサービス クラスに適用することで、コールバック関数名を指定することもできます。

[ServiceContract]
[JavascriptCallbackBehavior(ParameterName = "$callback")]
public class Service1
{
    [OperationContract]
    [WebGet(ResponseFormat=WebMessageFormat.Json)]
    public string GetData()
    {
    }
}

前に示したサービスの場合、要求は次のようになります。

http://baseaddress/Service/RestService?$callback=anotherFunction

呼び出されると、サービスは次のように応答します。

anotherFunction ({"root":"Something"});

HTTP 状態コード

HTTP 状態コードが 200 以外の JSONP 応答には、次の例に示すように、HTTP 状態コードの数値表現を含む 2 番目のパラメーターが含まれます。

anotherFunction ({"root":"Something"}, 201);

検証

JSONP が有効になっている場合、次の検証が実行されます。

  • WCF インフラストラクチャは、 javascriptCallback が有効になっている場合、コールバック クエリ文字列パラメーターが要求に存在し、応答形式が JSON に設定されている場合に例外をスローします。

  • 要求にコールバック クエリ文字列パラメーターが含まれているが、操作が HTTP GET でない場合、コールバック パラメーターは無視されます。

  • コールバック名が null または空の文字列の場合、応答は JSONP として書式設定されません。

こちらも参照ください