【问题标题】:How do I handle JSONP with WebAPI? [duplicate]如何使用 WebAPI 处理 JSONP? [复制]
【发布时间】: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 开始的。

标签: jsonp asp.net-web-api wcf-web-api


【解决方案1】:

大量窃取this duplicate....

要完成你想要的,你需要三件事:

  1. 添加一个输出 JSONP 的media formatter
  2. 注册媒体格式化程序(传统上通过 global.asx 完成)
  3. 确保客户端请求 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 的一部分。
猜你喜欢
  • 2012-06-05
  • 2013-10-01
  • 2011-08-19
  • 1970-01-01
  • 2016-09-16
  • 2013-10-05
  • 1970-01-01
  • 2011-03-01
相关资源
最近更新 更多