如何使用 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/javascripttext/javascript

【讨论】:

它是一个自托管服务器,所以我们有类似的东西: var config = new HttpSelfHostConfiguration("localhost:1234"); server = new HttpSelfHostServer(config); 我还没有使用自托管的东西,但我怀疑你需要为你传递给 HttpSelfHostServerconfig 对象添加一些属性 同意。它应该是这样的: config.Formatters[0] = new JsonpMediaTypeFormatter();然而,这种情况并非如此。 HttpSelfHostConfiguration 派生自没有为 Formatter 设置属性的 HttpConfiguration。谢谢! 好的。一切正常!谢谢你的帮助!我缺少 System.Net.Http.Formatting dll,因为我无法将 JsonpMediaTypeFormatter 添加到配置中。 JsonP 媒体格式化程序现在是 NuGet 中 WebApiContrib.Formatting.Jsonp 的一部分。

以上是关于如何使用 WebAPI 处理 JSONP? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

如何在 JavaScript 中使用 JSONP 请求执行 Ajax 调用? [复制]

使用 Ajax/jsonp 从 Web Api 接收数据

如何在 ServiceStack 中实现 JSONP 格式化程序

使用Cors后台设置WebAPI接口跨域访问

有人可以解释我如何像我五岁那样进行 JSONP 调用吗? [复制]

如何使用 jquery 处理从 jsonp 返回的 xml?