我有一组使用 WCF Web Api 托管的服务,我通过 javascript 使用 JSON 与它们进行通信。在大多数情况下,我可以修改标头的接受位以要求 JSON 响应,但在某些情况下我不能这样做。这是由于我正在使用的 javascript 框架(Ext JS)。对于某些事情,它只允许我指定一个 URL,而不是代理默认值,例如标头。
然而,这不是一个 Ext JS 问题。Web Api 似乎默认返回 XML,我想知道是否可以更改此默认设置,以便它可以返回 JSON。提前致谢!
我有一组使用 WCF Web Api 托管的服务,我通过 javascript 使用 JSON 与它们进行通信。在大多数情况下,我可以修改标头的接受位以要求 JSON 响应,但在某些情况下我不能这样做。这是由于我正在使用的 javascript 框架(Ext JS)。对于某些事情,它只允许我指定一个 URL,而不是代理默认值,例如标头。
然而,这不是一个 Ext JS 问题。Web Api 似乎默认返回 XML,我想知道是否可以更改此默认设置,以便它可以返回 JSON。提前致谢!
一些实验似乎表明配置格式化程序的顺序很重要(这很直观)。
默认情况下,当您创建 的实例时HttpConfiguration
,其Formatters
集合包含以下格式化程序:
XML 是默认格式的原因是因为它是第一个格式化程序。要使 JSON 成为默认值,您可以将集合重新排序为如下所示:
给定一个config
HttpConfiguration 的实例,这是对集合重新排序的一种方法:
var jsonIndex = Math.Max(
config.Formatters.IndexOf(config.Formatters.JsonFormatter),
config.Formatters.IndexOf(config.Formatters.JsonValueFormatter));
var xmlIndex = config.Formatters.IndexOf(
config.Formatters.XmlFormatter);
config.Formatters.Insert(jsonIndex + 1, config.Formatters.XmlFormatter);
config.Formatters.RemoveAt(xmlIndex);
我不知道这是否受支持,但它似乎适用于 WebApi 0.6.0。
我实际上找到了一种简单的方法来处理这个问题。首先确保默认的 JSON 格式化程序是第一个。然后将其类型设置为 text/html。这将确保浏览器即使没有设置标头也能获取 JSON。下面的好处是您永远不必记住在客户端代码中设置接受标头。它可以正常工作并且始终默认为 JSON。
var jsonformatter = config.Formatters.Where(t => t.GetType() == typeof(JsonMediaTypeFormatter)).FirstOrDefault());
config.Formatters.Remove(jsonformatter );
config.Formatters.Insert(0, jsonformatter);
config.Formatters[0].SupportedMediaTypes.Add(new MediaTypeHeaderValue("text/html"));
您可以使用此处描述的委托渠道http://blog.alexonasp.net/post/2011/07/26/Look-Ma-I-can-handle-JSONP-(aka-Cross-Domain-JSON)- with-WCF-Web-API-and-jQuery!.aspx将诸如http://myserver/myresource/1/json 之类的URI 映射到http://myserver/myresource/1并将接受标头设置为 application/json。
当您从http://wcf.codeplex.com下载 WCF Web API 时,委派渠道是 ContactManager_Advanced 示例的一部分。
它包含在 UriFormatExtensionMessageChannel.cs 文件中。
查看示例的 global.asax.cs 以了解如何使其运行。
根据代码,如果 WCF Web API 在可用格式化程序的集合中,它将始终默认为 XmlFormatter。如果不是,则使用 JsonFormatter(如果存在)。还有一个 DefaultFormatter 属性,但它是内部的,所以你不能设置它。也许一个有用的功能请求添加?