c# - ASP.NET Web API 中的内容协商

标签 c# asp.net-web-api content-negotiation

我正在将 Web 服务迁移到 ASP.NET Web Api 2,但几乎在第一个障碍上就遇到了麻烦。

我想这样做:

public class SomeController : ApiController
{
    [Route("some\url")]
    public object Get()
    {
        return { Message = "Hello" };
    }
}

并且能够向服务请求“application/json”或“application/xml”(或者实际上任何其他潜在格式,例如消息包),并获得序列化响应。但它似乎只适用于 JSON。

我已阅读 this并看到了documentation其中明确指出该框架无法处理匿名类型到 XML 的序列化(认真地),并且解决方案是不使用 XML(认真地)。

当我尝试调用它并请求 XML 作为响应类型时,我得到

The 'ObjectContent`1' type failed to serialize the response body for content type 'application/xml; charset=utf-8'.

我不会取消对想要请求 XML 的客户的支持 - 但我确实找不到解决此问题的方法 - 我能做什么?

编辑

我添加了这些:

System.Web.Http.GlobalConfiguration.Configuration.Formatters.XmlFormatter.SupportedMediaTypes.Clear();
config.Formatters.Insert(0, new System.Net.Http.Formatting.JsonMediaTypeFormatter());
config.Formatters.Insert(0, new System.Net.Http.Formatting.XmlMediaTypeFormatter());

按照 Dalorzo 的回答,但这没有什么区别。

澄清一下,当我使用 application/json 的接受 header 调用该服务时,该服务工作得非常好。 ,但是当我使用 application/xml 的接受 header 调用它时会发生炸弹。 .

最佳答案

您有 3 个选择:

  1. 创建一个具有适当名称的类并返回对象而不是匿名类型。
  2. 或者如果你想返回匿名实例,你应该删除 XML 格式化程序,因为匿名类型 are not supported by XML Formatter

  3. 创建您自己的格式化程序,继承自 MediaTypeFormatterBufferedMediaTypeFormatter

关于c# - ASP.NET Web API 中的内容协商,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23746469/

相关文章:

rest - 使用 URI 与接受 header 进行 REST 内容格式协商的优缺点是什么?

c# - 如何表示整数无穷大?

c# - 检查函数连续返回值的次数

c# - 当我将可空 int 转换为字符串时,为什么 null 合并运算符不对它起作用?

c# - 如何使用相同的通用方法来验证不同类型

java - 使用 spring-boot : Content Negotiation failed! 未找到类型返回值的转换器

C# 网格绑定(bind)不更新

c# - 在使用 Json.Net 的 WebAPI 2 中,SQL Server 时间戳序列化但不反序列化

angularjs - Web API 仅日期 UTC 转换

javascript - 内容协商 - 在 Firefox 中显示图像