86

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

“ObjectContent`1”类型无法序列化内容类型“application/xml”的响应正文;字符集=utf-8'。

我的控制器是:

public Employee GetEmployees()
{
    Employee employees = db.Employees.First();
    return employees;
}

为什么我会收到此错误?

4

15 回答 15

121

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

接受的答案对我不起作用,因为它只会改变 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);

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

于 2013-11-27T20:02:45.743 回答
43

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

GlobalConfiguration.Configuration.Formatters.JsonFormatter.SerializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore;

希望对你有帮助!

于 2012-10-09T05:46:13.810 回答
29

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

前任:

public class User
{
    public User()
    {
    }
}

希望它和你一起工作!

于 2013-03-28T17:15:57.507 回答
22

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

    public MyController()
    {

        db.Configuration.ProxyCreationEnabled = false;
    }
于 2013-02-27T16:15:09.797 回答
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
 }

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

        var json = config.Formatters.JsonFormatter;
        json.SerializerSettings.PreserveReferencesHandling = Newtonsoft.Json.PreserveReferencesHandling.Objects;
        config.Formatters.Remove(config.Formatters.XmlFormatter);
于 2013-03-06T02:36:51.210 回答
8

解决方法很简单。

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

它会进行急切加载而不是延迟加载数据

于 2013-09-13T17:50:06.123 回答
5

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

public CustomerPortalContext()
            : base("Name=CustomerPortalContext")
        {
            base.Configuration.ProxyCreationEnabled = false;
        }
于 2014-04-08T16:38:15.000 回答
4

如果您正在使用 EF,除了在 Global.asax 上添加以下代码

            GlobalConfiguration.Configuration.Formatters.JsonFormatter.SerializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore;
        GlobalConfiguration.Configuration.Formatters.Remove(GlobalConfiguration.Configuration.Formatters.XmlFormatter);          

不要忘记导入

using System.Data.Entity;

然后您可以返回您自己的 EF 模型

于 2015-03-01T01:00:32.133 回答
3

如果使用 Entity Framework 的 web api,一个解决方案可能是 Failed to serialize the response in Web API with Json

基本上,您需要为每个 EF 模型创建一个模型,这消除了类之间的依赖关系并允许轻松序列化。

代码:(取自参考链接)

创建用户模型

public class UserModel
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
}

更改我的方法 GetAll()

public IEnumerable<UserModel> GetAll()
{
    using (Database db = new Database ())
    {
        List<UserModel> listOfUsers = new List<UserModel>();
        UserModel userModel = new UserModel();
        foreach(var user in db.Users)
        {
           userModel.FirstName = user.FirstName;
           userModel.LastName = user.LastName;
           listOfUsers.Add(userModel);
        }
        IEnumerable<UserModel> users = listOfUsers;

        return users;
    }
}
于 2015-01-07T00:11:11.810 回答
3

请检查此问题的 web api 文档,处理循环对象引用

问候

于 2013-05-15T14:14:33.690 回答
2

默认实体 6 使用 XML到 apis,在您的项目中,找到文件“Global.asax”文件并添加此行:

GlobalConfiguration.Configuration.Formatters.Remove(GlobalConfiguration.Configuration.Formatters.XmlFormatter);

此行删除 XML 格式化程序。

于 2016-02-12T20:19:23.260 回答
1

嗯,以下可能会有所帮助。

我遇到了同样的异常,在我的情况下,我首先传递了为实体代码创建的实际 poco 实体。因为它包含与其他实体的关系,所以我只是在它之上创建了 viewmapper/dto 实体以返回。

它现在工作正常。

Poco 实体:

public class Tag
{
public int Id{get;set;}
public string Title{get;set;}
public IList<Location> Locations{get;set;}
}

ViewMapper/Dto

public class TagResultsViewMapper
{
public int Id{get;set;}
public string Title{get;set;}
//just remove the following relationship 
//public IList<Location> Locations{get;set;}
}
于 2013-02-20T06:37:45.830 回答
1

但是如果你发现其他实体/类的这个问题,你必须为每个类创建一个新的 DTO,如果你有很多,你可以找到一个问题,我认为创建一个 DTO 只是为了解决这个问题不是最好的方法...

你试过这个吗?

var json = GlobalConfiguration.Configuration.Formatters.JsonFormatter;
json.SerializerSettings.PreserveReferencesHandling = 
Newtonsoft.Json.PreserveReferencesHandling.All;

问候

于 2013-08-14T16:53:01.973 回答
0

你的问题和我的很相似。您不得直接从数据库返回数据。为此,您必须创建模型并关联要显示的数据。

在我的示例中,Json 无法序列化有关 User 的数据,我创建了一个 userModel,并且在我的 API 中,我从数据库返回 userModel 而不是 User。

User 和 UserModel 之间转换或关联数据的逻辑必须在 API 中。

无法使用 Json 序列化 Web API 中的响应

于 2014-04-16T22:43:52.237 回答
0

这是我从我的 odata Web API 调用中得到的特定错误:

The 'ObjectContent`1' type failed to serialize the response 
body for content type 'application/json; odata.metadata=minimal'.

我终于发现我的 dbContext 类在 onModelCreating 中分配了一个格式错误的表名。所以 SqlClient 正在寻找我的数据库中不存在的表

于 2017-03-09T20:43:29.337 回答