使用 JSONP - WCF
JSON Padding (JSONP) 是一种在 Web 浏览器中启用跨站点脚本支持的机制。 JSONP 的设计是基于 Web 浏览器能够从与当前加载文档不同的站点加载脚本的功能。 该机制的工作原理是使用用户定义的回调函数名称填充 JSON 有效负载,如以下示例所示。
callback({"a" = \\"b\\"});
在前面的示例中, {"a" = \\"b\\"}JSON 有效负载包装在函数调用 callback中。 回调函数必须在当前网页中定义。 JSONP 响应的内容类型为 application/javascript。
不会自动启用 JSONP。 若要启用它,请将 javascriptCallbackEnabled 属性设置为 true HTTP 标准终结点之一(WebHttpEndpoint 或 WebScriptEndpoint),如以下示例所示。
回调函数的名称可以在名为回调的查询变量中指定,如以下 URL 所示。
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 状态代码的数字表示形式的第二个参数,如以下示例所示。
anotherFunction ({"root":"Something"}, 201);
验证
启用 JSONP 时,将执行以下验证:
如果 javascriptCallback 已启用,WCF 基础结构将引发异常,请求中存在回调查询字符串参数,并且响应格式设置为 JSON。
如果请求包含回调查询字符串参数,但作不是 HTTP GET,则忽略回调参数。
如果回调名称为 null 空字符串,则响应的格式不是 JSONP。
另请参阅
WCF Web HTTP 编程模型概述