我正在研究一个ASP.NET Web API,只是试图从我的数据库中返回一些数据,但我一直收到这个错误:
' ObjectContent`1'类型无法序列化内容类型' application / xml的响应正文;字符集= UTF-8'
我已尝试将以下内容添加到Global.asax文件中,如同我的其他类似问题所示,但它所做的只是更改错误的格式。
GlobalConfiguration.Configuration.Formatters.JsonFormatter.SerializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore;
GlobalConfiguration.Configuration.Formatters.Remove(GlobalConfiguration.Configuration.Formatters.XmlFormatter);
我的控制器如下所示:
public class SQLController : ApiController
{
public IEnumerable<Alias> Get()
{
using (DatabaseEntities entities = new DatabaseEntities())
{
return entities.Aliases.ToList();
}
}
public Alias Get(int id)
{
using (DatabaseEntities entities = new DatabaseEntities())
{
return entities.Aliases.FirstOrDefault(a => a.ID == id);
}
}
}
我尝试了一些与更简单的数据库非常相似的东西,它运行良好。我还读过,制作一个单独的数据模型可以解决这个问题吗?如果是这样,为什么,我将如何做到这一点?任何帮助,弄清楚我收到此错误的原因将不胜感激。
答案 0 :(得分:1)
看起来像实体框架延迟加载相关实体并创建无限循环的问题。
您最好的选择是禁用延迟加载并手动加载相关对象。 可以为整个Context全局禁用延迟加载,仅针对某些关系甚至每个查询本地禁用。
Globaly:
public class BloggingContext : DbContext
{
public BloggingContext()
{
this.Configuration.LazyLoadingEnabled = false;
}
}
本地:
using (DatabaseEntities entities = new DatabaseEntities())
{
entities.Configuration.LazyLoadingEnabled = false;
return entities.Aliases.FirstOrDefault(a => a.ID == id);
}
如果要禁用特定属性,则只需从导航属性中删除虚拟:
public class Blog
{
public int BlogId { get; set; }
public string Name { get; set; }
public string Url { get; set; }
public string Tags { get; set; }
public ICollection<Post> Posts { get; set; }
}
有关此内容的更多数据,请参阅官方micrsofot文档https://msdn.microsoft.com/en-us/library/jj574232(v=vs.113).aspx
答案 1 :(得分:0)
试试这个
使用“IHttpActionResult”作为返回类型
[HttpGet]
public IHttpActionResult Get()
{
using (DatabaseEntities entities = new DatabaseEntities())
{
return Ok(entities.Aliases.ToList());
}
}
public IHttpActionResult Get(int id)
{
using (DatabaseEntities entities = new DatabaseEntities())
{
return Ok(entities.Aliases.FirstOrDefault(a => a.ID == id));
}
}