【问题标题】:How to return Xml rather than JSON from a Web API Action?如何从 Web API 操作返回 Xml 而不是 JSON?
【发布时间】:2013-03-25 09:51:06
【问题描述】:

如何在 Web API 控制器中配置操作,以返回 XML 而不是 JSON?

我有一个动作,它返回一个具有 XmlElement 属性的 UserProfile 对象:

[HttpGet]
        public UserProfile SearchByEmail(string siteName, string email)
        {
            var userProfile = this._profileFinderByEmail.Find(siteName, email);

            if (userProfile == null)
            {
                throw new HttpResponseException(HttpStatusCode.NotFound);
            }

            return userProfile;
        }

当我运行此操作时,它返回 application/json 而不是 xml。我怎么能返回xml?

根据 Fiddler 判断,我发送的请求标头具有以下 Accept 标头键:

Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8

我希望它返回 xml,但它没有。

如何解决?

我还在 WebApiConfig 类中设置了以下值:

GlobalConfiguration.Configuration.Formatters.XmlFormatter.UseXmlSerializer = true;

从 Chrome/网络选项卡查看,我可以看到以下错误:

Status Code:406 Not Acceptable

【问题讨论】:

  • 你确定,你将你的控制器连接到“ApiController”吗?
  • 是的,我的控制器继承自 ApiController。

标签: xml asp.net-mvc json asp.net-web-api


【解决方案1】:

标题看起来正确,所以首先你应该检查格式化程序是否存在。您可以使用以下 sn-p 输出所有已注册的格式化程序(您可以在操作方法中使用它):

foreach (var formatter in GlobalConfiguration.Configuration.Formatters)
{
    System.Diagnostics.Debug.WriteLine(String.Format("{0}: {1}", formatter.GetType().Name, String.Join(", ", formatter.SupportedMediaTypes.Select(x=>x.MediaType))));
}

结果将在 Visual StudioOutput 窗口中可见(将 Show output from 设置为 Debug) .你应该寻找这样的行:

XmlMediaTypeFormatter: application/xml, text/xml

如果它不存在,则意味着它以某种方式被删除,您需要在应用程序中找到该部分代码。如果它在那里,则很可能意味着DataContractSerializer 无法序列化您的实体(您可以阅读更多关于支持的类型here)。

您还提到您在实体中使用XmlElement 属性。默认情况下XmlMediaTypeFormatter 使用DataContractSerializer(如上所述)将忽略这些属性。如果您想将其切换为XmlSerializer,您可以使用以下代码(例如在您的Global.asax 中):

GlobalConfiguration.Configuration.Formatters.XmlFormatter.UseXmlSerializer = true;

当然XmlSerializer 有自己的一组限制,您需要注意这些限制。

【讨论】:

  • 谢谢。我已经看到 XmlMediaTypeFormatter: application/xml, text/xml 存在而 JSON 不存在。调试器没有在 global.ascx 文件中中断也很奇怪。
  • @TheLight HTTP 错误 406 (Not Acceptable) 表示未找到合适的格式化程序(此类接受标头的格式化程序或格式化程序无法格式化实体)。你可以阅读更多here
猜你喜欢
  • 2013-08-18
  • 2012-04-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多