我有一组托管了WCF Web Api的服务,我通过javascript以JSON方式与它们进行通信。在大多数情况下,我可以修改标头的接受位以要求JSON响应,但是在某些情况下我无法做到这一点。这是由于我正在使用的javascript框架(Ext JS)。对于某些事情,它只允许我指定一个URL而不是代理默认值,如标题。
然而,这不是Ext JS问题。 Web Api似乎默认返回XML,我想知道是否可以更改此默认值以便它可以返回JSON。提前致谢!
答案 0 :(得分:4)
一些实验似乎表明配置的格式化程序的顺序很重要(这非常直观)。
默认情况下,当您创建HttpConfiguration
的实例时,其Formatters
集合包含以下格式化程序:
XML是默认格式的原因是因为它是第一个格式化程序。要使JSON成为默认值,您可以将集合重新排序为如下所示:
给定HttpConfiguration的实例config
,这是重新排序集合的一种方法:
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。
答案 1 :(得分:3)
我实际上找到了解决这个问题的简单方法。首先确保默认的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"));
答案 2 :(得分:2)
您可以使用此处所述的委托频道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,并将accept标头设置为application / json。
当您从http://wcf.codeplex.com下载WCF Web API时,委派频道是ContactManager_Advanced示例的一部分。
它包含在UriFormatExtensionMessageChannel.cs文件中。
查看示例的global.asax.cs,了解如何使其运行。
答案 3 :(得分:1)
根据代码,如果WCF Web API位于可用格式化程序集合中,它将始终默认为XmlFormatter。如果不存在,则使用JsonFormatter,如果存在则。还有一个DefaultFormatter属性,但它是内部的,所以你不能设置它。也许是一个有用的功能要求添加?