我正在使用ASP.NET MVC Web API,但遇到此错误:
“ ObjectContent`1”类型未能序列化内容类型“ application / xml”的响应主体;charset = utf-8'。
我的控制器是:
public Employee GetEmployees()
{
Employee employees = db.Employees.First();
return employees;
}
为什么我收到此错误?
我正在使用ASP.NET MVC Web API,但遇到此错误:
“ ObjectContent`1”类型未能序列化内容类型“ application / xml”的响应主体;charset = utf-8'。
我的控制器是:
public Employee GetEmployees()
{
Employee employees = db.Employees.First();
return employees;
}
为什么我收到此错误?
Answers:
对我来说,这是循环引用的问题。
接受的答案对我不起作用,因为它仅更改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;
希望对您有所帮助!
Global.asax
的中Application_Start
,但没有更改。
我遇到了同样的问题。我解决了。我将默认构造函数放入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);
如果您使用的是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模型
请检查Web API文档中是否存在此问题, 处理循环对象引用
问候
如果您将Web API与Entity Framework一起使用,则可能无法通过Json在Web API中序列化响应的解决方案
基本上,您需要创建一个与每个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;
}
}
默认实体6使用XML进行api,在您的项目中,找到文件“ Global.asax”并添加以下行:
GlobalConfiguration.Configuration.Formatters.Remove(GlobalConfiguration.Configuration.Formatters.XmlFormatter);
此行删除XML格式化程序。
但是如果您发现其他实体/类存在此问题,则必须为每个类创建一个新的DTO,并且如果您有很多实体/类,您会发现一个问题,我也认为创建DTO仅用于解决此问题不是最好的方法...
你有尝试过吗?
var json = GlobalConfiguration.Configuration.Formatters.JsonFormatter;
json.SerializerSettings.PreserveReferencesHandling =
Newtonsoft.Json.PreserveReferencesHandling.All;
问候
嗯,以下内容可能会有所帮助。
我遇到了同样的异常,在我的情况下,我首先传递了为实体代码创建的实际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;}
}
您的问题与我的非常相似。您不得直接从数据库返回数据。为此,您必须创建模型并关联要显示的数据。
在我的示例中,有Json无法序列化的有关User的数据,我创建了一个userModel,并且在我的API中,我从数据库中返回了userModel而不是User。
在User和UserModel之间转换或关联数据的逻辑必须在API中。
InnerException
序列化异常的属性,以找出导致序列化失败的确切原因。