从MVC 4 Web Api返回匿名类型失败,并出现序列化错误

Che*_*hev 18 c# asp.net asp.net-mvc asp.net-mvc-4 asp.net-web-api

我刚刚开始使用MVC 4 Web API,我似乎误解了它是如何工作的.

在Web API之前,我有一个像这样的简单MVC操作方法:

public JsonResult User()
{
    return Json(new
    {
        firstName = "Joe",
        lastName = "Jacobs",
        email = "joe.jacobs@gmail.com"
    });
}
Run Code Online (Sandbox Code Playgroud)

那会很好.在新的Web API控制器中,我正在尝试做类似的事情.

public object User()
{
    return new
    {
        firstName = "Joe",
        lastName = "Jacobs",
        email = "joe.jacobs@gmail.com"
    }
}
Run Code Online (Sandbox Code Playgroud)

这会因序列化错误而失败:

'ObjectContent`1'类型无法序列化内容类型'application/xml的响应主体; 字符集= UTF-8' .

内部异常:

类型'<> f__AnonymousType1`3 [System.String,System.String,System.String]'无法序列化.请考虑使用DataContractAttribute属性对其进行标记,并使用DataMemberAttribute属性标记要序列化的所有成员.如果类型是集合,请考虑使用CollectionDataContractAttribute对其进行标记.有关其他受支持的类型,请参阅Microsoft .NET Framework文档.

关于从API控制器返回匿名类型我不明白的是什么?

cuo*_*gle 32

如果你看一下Fiddler(我在这里使用的是Firefox)

在此输入图像描述

默认情况下,来自浏览器的请求将接受 application/xml,而不是application/json

但是,您可以通过添加一个标头来创建来自Fiddler的虚假请求:

Accept: application/json
Run Code Online (Sandbox Code Playgroud)

它会工作

链接:

XML序列化程序不支持匿名类型或JObject实例.如果将这些功能用于JSON数据,则应从管道中删除XML格式化程序,如本文后面所述.

如何删除XmlFormatter:

  var configuration = GlobalConfiguration.Configuration;
  configuration.Formatters.Remove(configuration.Formatters.XmlFormatter);
Run Code Online (Sandbox Code Playgroud)