我正在研究 ASP.NET MVC Web API,我遇到了这个错误:
“ObjectContent`1”类型无法序列化内容类型“application/xml”的响应正文;字符集=utf-8'。
我的控制器是:
public Employee GetEmployees()
{
Employee employees = db.Employees.First();
return employees;
}
为什么我会收到此错误?
我正在研究 ASP.NET MVC Web API,我遇到了这个错误:
“ObjectContent`1”类型无法序列化内容类型“application/xml”的响应正文;字符集=utf-8'。
我的控制器是:
public Employee GetEmployees()
{
Employee employees = db.Employees.First();
return employees;
}
为什么我会收到此错误?
对我来说,这是循环引用的问题。
接受的答案对我不起作用,因为它只会改变 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 结果,则需要找到不同的解决方案。
在您的 global.asax 文件中,在 Application_start() 方法中添加以下行:
GlobalConfiguration.Configuration.Formatters.JsonFormatter.SerializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore;
希望对你有帮助!
我遇到了同样的问题。我解决了它。我将默认构造函数放入 DTO 类。
前任:
public class User
{
public User()
{
}
}
希望它和你一起工作!
把它放在构造函数中。希望这能解决问题:
public MyController()
{
db.Configuration.ProxyCreationEnabled = false;
}
我找到了两个解决方案。第一个也是最容易实现的是将任何 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);
解决方法很简单。
在 LINQ 查询后添加 .ToList() (或 ToDictionary 如果需要)。
它会进行急切加载而不是延迟加载数据
** 当从客户端从请求 web api/wcf/... 调用时会发生此错误,但作为副作用,您需要通过 include 关键字包含依赖关系。**
public CustomerPortalContext()
: base("Name=CustomerPortalContext")
{
base.Configuration.ProxyCreationEnabled = false;
}
如果您正在使用 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 模型
如果使用 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;
}
}
请检查此问题的 web api 文档,处理循环对象引用
问候
默认实体 6 使用 XML到 apis,在您的项目中,找到文件“Global.asax”文件并添加此行:
GlobalConfiguration.Configuration.Formatters.Remove(GlobalConfiguration.Configuration.Formatters.XmlFormatter);
此行删除 XML 格式化程序。
嗯,以下可能会有所帮助。
我遇到了同样的异常,在我的情况下,我首先传递了为实体代码创建的实际 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;}
}
但是如果你发现其他实体/类的这个问题,你必须为每个类创建一个新的 DTO,如果你有很多,你可以找到一个问题,我认为创建一个 DTO 只是为了解决这个问题不是最好的方法...
你试过这个吗?
var json = GlobalConfiguration.Configuration.Formatters.JsonFormatter;
json.SerializerSettings.PreserveReferencesHandling =
Newtonsoft.Json.PreserveReferencesHandling.All;
问候
你的问题和我的很相似。您不得直接从数据库返回数据。为此,您必须创建模型并关联要显示的数据。
在我的示例中,Json 无法序列化有关 User 的数据,我创建了一个 userModel,并且在我的 API 中,我从数据库返回 userModel 而不是 User。
User 和 UserModel 之间转换或关联数据的逻辑必须在 API 中。
这是我从我的 odata Web API 调用中得到的特定错误:
The 'ObjectContent`1' type failed to serialize the response
body for content type 'application/json; odata.metadata=minimal'.
我终于发现我的 dbContext 类在 onModelCreating 中分配了一个格式错误的表名。所以 SqlClient 正在寻找我的数据库中不存在的表!