5

我有一组使用 WCF Web Api 托管的服务,我通过 javascript 使用 JSON 与它们进行通信。在大多数情况下,我可以修改标头的接受位以要求 JSON 响应,但在某些情况下我不能这样做。这是由于我正在使用的 javascript 框架(Ext JS)。对于某些事情,它只允许我指定一个 URL,而不是代理默认值,例如标头。

然而,这不是一个 Ext JS 问题。Web Api 似乎默认返回 XML,我想知道是否可以更改此默认设置,以便它可以返回 JSON。提前致谢!

4

4 回答 4

4

一些实验似乎表明配置格式化程序的顺序很重要(这很直观)。

默认情况下,当您创建 的实例时HttpConfiguration,其Formatters集合包含以下格式化程序:

  1. XmlMediaTypeFormatter
  2. JsonValueMediaTypeFormatter
  3. JsonMediaTypeFormatter
  4. FormUrlEncodedMediaTypeFormatter

XML 是默认格式的原因是因为它是第一个格式化程序。要使 JSON 成为默认值,您可以将集合重新排序为如下所示:

  1. JsonValueMediaTypeFormatter
  2. JsonMediaTypeFormatter
  3. XmlMediaTypeFormatter
  4. FormUrlEncodedMediaTypeFormatter

给定一个configHttpConfiguration 的实例,这是对集合重新排序的一种方法:

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。

于 2012-01-25T11:40:25.960 回答
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"));
于 2012-04-17T19:08:39.327 回答
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并将接受标头设置为 application/json。

当您从http://wcf.codeplex.com下载 WCF Web API 时,委派渠道是 ContactManager_Advanced 示例的一部分。

它包含在 UriFormatExtensionMessageChannel.cs 文件中。

查看示例的 global.asax.cs 以了解如何使其运行。

于 2011-07-26T20:13:49.913 回答
1

根据代码,如果 WCF Web API 在可用格式化程序的集合中,它将始终默认为 XmlFormatter。如果不是,则使用 JsonFormatter(如果存在)。还有一个 DefaultFormatter 属性,但它是内部的,所以你不能设置它。也许一个有用的功能请求添加?

于 2011-07-22T08:42:40.430 回答