无法在Web API中序列化响应

Tam*_*Dey 84 c# serialization asp.net-web-api

我正在使用ASP.NET MVC Web API,我遇到了这个错误:

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

我的控制器是:

public Employee GetEmployees()
{
    Employee employees = db.Employees.First();
    return employees;
}
Run Code Online (Sandbox Code Playgroud)

为什么我收到这个错误?

Zan*_*ane 118

对我来说这是循环引用的问题.

接受的答案对我不起作用,因为它只改变了JSON格式化程序的行为,但是当我从浏览器调用服务时,我得到了XML.

为了解决这个问题,我关闭了XML并强制只返回JSON.

在Global.asax文件中,将以下行放在Application_Start方法的顶部:

GlobalConfiguration.Configuration.Formatters.JsonFormatter.SerializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore;
GlobalConfiguration.Configuration.Formatters.Remove(GlobalConfiguration.Configuration.Formatters.XmlFormatter);
Run Code Online (Sandbox Code Playgroud)

现在只返回JSON结果.如果您需要XML结果,则需要找到不同的解决方案.


Jul*_*eda 43

在您的global.asax文件中,在Application_start()方法中添加以下行:

GlobalConfiguration.Configuration.Formatters.JsonFormatter.SerializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore;
Run Code Online (Sandbox Code Playgroud)

我希望能帮到你!

  • 这仍然不适合我.但是我在这个答案中添加了另一行后它起作用了:GlobalConfiguration.Configuration.Formatters.Remove(GlobalConfiguration.Configuration.Formatters.XmlFormatter); 我在下面创建了一个更完整的答案 (8认同)
  • 行添加到`Global.asax`的`Application_Start`,但没有变化. (5认同)
  • 对不起,这句话的意思是什么? (4认同)
  • 什么是application_start,它在哪里可以找到?这条线应该放在哪里? (3认同)
  • 不应该接受这个答案,因为它确实删除了XmlSerializer,而不是用XmlSerializer来解决循环引用的问题. (2认同)

tay*_*yen 29

我遇到了同样的问题.我解决了它.我将默认构造函数放到DTO类中.

例如:

public class User
{
    public User()
    {
    }
}
Run Code Online (Sandbox Code Playgroud)

希望它能和你合作!


Sad*_*aie 21

把它放在构造函数中.希望这解决问题:

    public MyController()
    {

        db.Configuration.ProxyCreationEnabled = false;
    }
Run Code Online (Sandbox Code Playgroud)


Ray*_*zer 16

我找到了两个解决方案.第一个也是最容易实现的是将任何IEnumerables,ICollections更改为List类型.WebAPI可以序列化这些对象,但是它不能序列化接口类型.

public class Store
{

  [StringLength(5)]
    public string Zip5 { get; set; }

    public virtual List<StoreReport> StoreReports { get; set; }  //use a list here
 }
Run Code Online (Sandbox Code Playgroud)

另一个选项是不使用本机JSON序列化程序并在WebApi配置的Register方法中运行此覆盖:

        var json = config.Formatters.JsonFormatter;
        json.SerializerSettings.PreserveReferencesHandling = Newtonsoft.Json.PreserveReferencesHandling.Objects;
        config.Formatters.Remove(config.Formatters.XmlFormatter);
Run Code Online (Sandbox Code Playgroud)


om4*_*987 8

解决方案很简单.

在LINQ查询之后添加.ToList()(或ToDictionary,如果需要).

与延迟加载数据相比,它会进行急切加载


Moh*_*bdo 5

** 从客户端从请求 web api/wcf/... 调用时会发生此错误,但作为副作用,您需要通过 include 关键字包含依赖关系。**

public CustomerPortalContext()
            : base("Name=CustomerPortalContext")
        {
            base.Configuration.ProxyCreationEnabled = false;
        }
Run Code Online (Sandbox Code Playgroud)