如何使用 WebAPI 处理 JSONP? [复制]
Posted
技术标签:
【中文标题】如何使用 WebAPI 处理 JSONP? [复制]【英文标题】:How do I handle JSONP with WebAPI? [duplicate] 【发布时间】:2012-05-17 20:20:48 【问题描述】:可能重复:JSONP with MVC 4 WebApi
我的 WebAPI 有一个 get 方法,如下所示:
private T Get<T>(string uri)
T result = default(T);
bool isSuccess = true;
client
.GetAsync(uri)
.ContinueWith(task =>
// EnsureStatus
isSuccess = task.Result.IsSuccessStatusCode;
task
.Result
.Content
.ReadAsAsync<T>()
.ContinueWith(t => result = t.Result)
.Wait();
)
.Wait();
return result;
结果以 JSON 格式生成,但我希望它用于 JSONP。
我读到ReadAsSync
只处理内置的媒体格式化程序。那么有没有办法改变它来处理JsonP?
【问题讨论】:
为什么在 .NET 客户端上需要 JSONP? 经常使用 JSONP 跨域拉取数据。 @EBarr 是的,在 javascript 和浏览器中。当您拥有成熟的 .NET 客户端时不会。如果客户端请求application/json
,服务器必须能够提供 json。这是一个内容协商问题。
@EBarr - 你是对的!我没有成熟的 .NET 客户端。所以这是一个内容协商问题。添加一个额外的方法来处理 Jsonp 可能会有所帮助。我阅读了有关 JsonpMediaTypeFormatter 的信息,它应该被添加到 global.asax 的 Application_Start 中。但我们不是从 global.asax 开始的。
【参考方案1】:
大量窃取this duplicate....
要完成你想要的,你需要三件事:
-
添加一个输出 JSONP 的
media formatter
注册媒体格式化程序(传统上通过 global.asx 完成)
确保客户端请求 jsonP。
你可以窃取这个 JSONP 媒体formatter。
然后,您需要注册媒体格式化程序。您可以使用以下代码 sn-p 以编程方式执行此操作:
var config = GlobalConfiguration.Configuration;
config.Formatters.Insert(0, new JsonpMediaTypeFormatter());
由于您显然不使用 global.asax,因此您需要确保格式化程序以某种方式注册。您没有提供有关如何执行此操作的足够信息,但我怀疑明智地放置 IF 语句和指示注册的静态变量会让您到达那里。
我仍然不太清楚您使用的是哪种类型的客户端,但如果是 jquery,则类似以下内容将帮助您:
$.ajax(
url: 'http://myurl.com',
type: 'GET',
dataType: 'jsonp',
success: function (data)
alert(data.MyProperty);
)
重要的部分是 accept
发送的标头与您闪亮的新 jsonp 格式化程序正在侦听的接受标头匹配。在我看来,前两个选择是:application/javascript
或 text/javascript
。
【讨论】:
它是一个自托管服务器,所以我们有类似的东西: var config = new HttpSelfHostConfiguration("localhost:1234"); server = new HttpSelfHostServer(config); 我还没有使用自托管的东西,但我怀疑你需要为你传递给HttpSelfHostServer
的 config
对象添加一些属性
同意。它应该是这样的: config.Formatters[0] = new JsonpMediaTypeFormatter();然而,这种情况并非如此。 HttpSelfHostConfiguration 派生自没有为 Formatter 设置属性的 HttpConfiguration。谢谢!
好的。一切正常!谢谢你的帮助!我缺少 System.Net.Http.Formatting dll,因为我无法将 JsonpMediaTypeFormatter 添加到配置中。
JsonP 媒体格式化程序现在是 NuGet 中 WebApiContrib.Formatting.Jsonp 的一部分。以上是关于如何使用 WebAPI 处理 JSONP? [复制]的主要内容,如果未能解决你的问题,请参考以下文章
如何在 JavaScript 中使用 JSONP 请求执行 Ajax 调用? [复制]
如何在 ServiceStack 中实现 JSONP 格式化程序