在WCF Web Api中设置默认响应类型

时间:2011-07-21 16:13:11

标签: ajax wcf wcf-web-api

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

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

4 个答案:

答案 0 :(得分:4)

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

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

  1. XmlMediaTypeFormatter
  2. JsonValueMediaTypeFormatter
  3. JsonMediaTypeFormatter
  4. FormUrlEncodedMediaTypeFormatter
  5. XML是默认格式的原因是因为它是第一个格式化程序。要使JSON成为默认值,您可以将集合重新排序为如下所示:

    1. JsonValueMediaTypeFormatter
    2. JsonMediaTypeFormatter
    3. XmlMediaTypeFormatter
    4. FormUrlEncodedMediaTypeFormatter
    5. 给定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属性,但它是内部的,所以你不能设置它。也许是一个有用的功能要求添加?