我正在将 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 个选择:
- 创建一个具有适当名称的类并返回对象而不是匿名类型。
或者如果你想返回匿名实例,你应该删除 XML 格式化程序,因为匿名类型 are not supported by XML Formatter
创建您自己的格式化程序,继承自 MediaTypeFormatter 或 BufferedMediaTypeFormatter
关于c# - ASP.NET Web API 中的内容协商,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23746469/