我使用Web api从数据库中检索数据。我只有一个表“tblMessage”,并希望从该表中获取数据。
我设置了所有内容,但是当我运行网站时。错误总是说
'ObjectContent`1'类型无法序列化内容类型'application / xml
的响应正文
我在stackoverflow上读了一些帖子,说明错误可以通过告诉浏览器以json格式输出数据来修复。之后,错误变为
'ObjectContent`1'类型无法序列化内容类型'application / json
的响应正文
我已尝试过以下帖子中的所有解决方案,但他们没有解决问题(浏览器报告相同的错误)
Web API Error: The 'ObjectContent`1' type failed to serialize the response body for content type
Failed to serialize the response body for content type
Web API Error: The 'ObjectContent`1' type failed to serialize the response body for content type
这个错误究竟是什么?
public interface IMessage
{
IQueryable<Message> GetAll();
}
public class Message
{
[Key]
public int i_StmID { get; set; }
public string vch_MsgString { get; set; }
}
public class EFDBContext : DbContext
{
public DbSet<Message> Message { get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
modelBuilder.Entity<Message>().ToTable("tblMessage");
}
}
public class MessageRepository : IMessage
{
private EFDBContext context = new EFDBContext();
public IQueryable<Message> GetAll()
{
return context.tblMessage;
}
}
public class MessageController : ApiController
{
public IMessage repo = new MessageRepository();
public IEnumerable<Message> GetAllMsg()
{
return repo.GetAll();
}
}
答案 0 :(得分:5)
更改IEnumerable<Message
&gt;到List<Message>
public IEnumerable<Message> GetAllMsg()
{
return repo.GetAll();
}
到
public List<Message> GetAllMsg()
{
return repo.GetAll();
}
更新:
但要注意获取OutOfMemoryException
,因为此方法会将所有Message
个对象存储在本地内存中,因此您必须实现某种分页。
答案 1 :(得分:2)
对于这些类型的数据查询,您肯定应该为结果创建分页。在Web API中有2个分页选项。
第一个选项可以使用OData从action方法返回IQueryable对象。因此,您的操作支持分页。
第二个选项是创建一个支持分页的控制器。我在下面举了一个例子。
[HttpGet]
public List<Book> Books(int page = 0 , int size = 100){
using(var context = new BooksDataContext()){
List<Book> books = context.Books.OrderBy(t=> t.CreateDate).Skip(page * size).Take(size).ToList();
return books;
}
}
上面的代码支持分页,您可以设置将从客户端返回的集合计数。
答案 2 :(得分:2)
我与Chrome有同样的问题,而不是IE。为了解决这个问题,我在Global.asax.cs,Application_Start()方法中使用了以下几行:
GlobalConfiguration.Configuration.Formatters.JsonFormatter.SerializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore;
GlobalConfiguration.Configuration.Formatters.Remove(GlobalConfiguration.Configuration.Formatters.XmlFormatter);
答案 3 :(得分:1)
我遇到了同样的问题,这是我找到的解决方案
更新实体数据模型后,您必须在模型中将ProxyCreationEnabled
设置为false
Configuration.ProxyCreationEnabled = false;
我的例子:
public partial class EventsEntities : DbContext
{
public EventsEntities()
: base("name=EventsEntities")
{
Configuration.ProxyCreationEnabled = false;
}
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
throw new UnintentionalCodeFirstException();
}
}