在 Windows 应用程序中处理 JSONP 响应

Posted

技术标签:

【中文标题】在 Windows 应用程序中处理 JSONP 响应【英文标题】:Handling JSONP response in windows application 【发布时间】:2017-08-21 10:01:23 【问题描述】:

我有一个已设置为返回 JSONP 的 ASP.NET Web API 2 项目 (使用来自 GitHub (https://github.com/WebApiContrib) 的 ASP.NET Web API Contrib repo),现在当通过 jQuery 使用 API 时,我的 Web 应用程序中的一切看起来都很好。

但是,还有一个 windows 应用程序需要访问相同的数据,但我对如何在 c# 类中处理响应感到很茫然。

我有这段代码,当 API 返回纯 JSON 时,它运行良好(使用 JSON.NET):

    public List<DropItem> GetAvailableDomains()
    
        string jsonData = null;

        using (WebClient wc = new WebClient())
        
            jsonData = wc.DownloadString("http://foo.bar/api/core/getavailabledomains");
        

        return JsonConvert.DeserializeObject<List<DropItem>>(jsonData);
    

但是,使用 JSONP,由于响应中带有回调函数等的开销,它根本无法识别响应数据。

有没有好办法处理这个问题?

【问题讨论】:

好方法:让您的 API 有选择地返回 JSON 或 JSONP(根据 GET 参数或标头)。不好的方式:jsonData = jsonData.Replace("callback(", ""); jsonData = jsonData.Substring(0, jsonData.Length - 1); 之类的东西(请不要) 我也在考虑拥有它,我刚开始使用 WebAPI,使用 WCF 我脑子里已经有了这一切,但在这里我只是不知道如何将它放在适当的位置,以便API 将返回纯 JSON 或 JSONP。 :P 我已经用谷歌搜索并试图阅读如何实现它,但最终一无所获。 【参考方案1】:

这成功了

    public static void RegisterFormatters(MediaTypeFormatterCollection formatters)
    
        var jsonp = new JsonpMediaTypeFormatter(formatters.JsonFormatter);
        jsonp.MediaTypeMappings.Add(new QueryStringMapping("type", "jsonp", "application/json"));

        GlobalConfiguration.Configuration.Formatters.Add(jsonp);
        GlobalConfiguration.Configuration.Formatters.JsonFormatter.MediaTypeMappings.Add(new QueryStringMapping("type", "json", "application/json"));
    

【讨论】:

您能否稍微扩展一下这个答案 - 看起来这是服务器端更改而不是客户端更改(因此实际上可能会回答不同的问题)。可能编辑问题会是更好的选择。所问的问题将与***.com/questions/48470971/… 重复,但根据答案,它是关于不同的东西。

以上是关于在 Windows 应用程序中处理 JSONP 响应的主要内容,如果未能解决你的问题,请参考以下文章

带有 AngularJS 的 Windows Phone 8.1 上的 Phonegap 无法从我的 API 中检索 JSONP

在 ZEND 中处理 JSONP 调用

在 Angular JS 1.6 中处理 JSONP 响应

angularjs中jsonp请求的异常处理

支持 JSONP 的 ASP.NET 通用 HTTP 处理程序 (.ashx)

使用 JavaScript 制作和处理 JSONP 请求