未能在Web API中序列化响应
我正在研究ASP.NET MVC的Web API,我有这个错误:
“ObjectContent`1”types未能序列化内容types为“application / xml; 字符集= UTF-8' 。
我的控制器是:
public Employee GetEmployees() { Employee employees = db.Employees.First(); return employees; }
为什么我得到这个错误?
对我来说,这是一个循环引用的问题。
接受的答案不适用于我,因为它只会改变JSON格式化程序的行为,但是当我从浏览器调用服务时,我正在获取XML。
为了解决这个问题,我closures了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结果,你将需要find一个不同的解决scheme。
在你的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; }
我find了两个解决scheme。 第一个也是最容易实现的方法是将任何IEnumerables,ICollections更改为Listtypes。 WebAPI可以序列化这个对象,但是它不能序列化接口types。
public class Store { [StringLength(5)] public string Zip5 { get; set; } public virtual List<StoreReport> StoreReports { get; set; } //use a list here }
另一种select是不使用本机JSON序列化程序,并在WebApiconfiguration的注册方法中运行此覆盖:
var json = config.Formatters.JsonFormatter; json.SerializerSettings.PreserveReferencesHandling = Newtonsoft.Json.PreserveReferencesHandling.Objects; config.Formatters.Remove(config.Formatters.XmlFormatter);
解决方法很简单。
LINQ查询添加.ToList()(或ToDictionary,如果需要)。
它将执行加载而不是延迟加载数据
如果您正在使用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 / wcf / …时发生此错误,但作为副作用,您将需要通过include关键字包含依赖关系。 **
public CustomerPortalContext() : base("Name=CustomerPortalContext") { base.Configuration.ProxyCreationEnabled = false; }
如果您在Entity Framework中使用web api,则解决scheme可能无法使用Json序列化Web API中的响应
基本上,您需要创build一个对应于每个EF模型的模型,这样可以消除类之间的依赖关系,并且可以轻松地进行序列化。
代码:(取自参考链接)
创build一个UserModel
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; } }
但如果你发现这个问题与其他实体/类,你必须为每个类创build一个新的DTO,如果你有很多他们,你可以find一个问题,也认为创build一个DTO只为解决这个问题是不是最好的方法…
你试过这个吗?
var json = GlobalConfiguration.Configuration.Formatters.JsonFormatter; json.SerializerSettings.PreserveReferencesHandling = Newtonsoft.Json.PreserveReferencesHandling.All;
问候
嗯,以下可能会有所帮助。
我得到了同样的exception,在我的情况下,我先传递实体代码创build的实际poco实体。 既然它包含了与其他实体的关系,我只是在它的顶部创build了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;} }
默认实体6使用XML ,在您的项目中,find文件“Global.asax”文件,并添加以下行:
GlobalConfiguration.Configuration.Formatters.Remove(GlobalConfiguration.Configuration.Formatters.XmlFormatter);
这一行删除XML格式。
你的问题和我的很相似。 您不能直接从数据库返回数据。 为此,您必须创build模型并关联要显示的数据。
在我的例子中,有关于用户Json无法序列化的数据,我创build了一个userModel,并且在我的API中,我从数据库返回userModel而不是User。
User和UserModel之间的转换或关联数据的逻辑必须在API中。
无法使用Json序列化Web 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死亡寻找一个表不存在我的数据库 !