8

我使用 Web api 从数据库中检索数据。我只有 1 个表“tblMessage”并想从该表中获取数据。

我设置了所有内容,但是当我运行网站时。错误总是说

“ObjectContent`1”类型无法序列化内容类型“application/xml”的响应正文

我在 stackoverflow 上阅读了一些帖子,这些帖子说可以通过告诉浏览器以 json 格式输出数据来修复错误。之后,错误变为

“ObjectContent`1”类型无法序列化内容类型“application/json”的响应正文

我已经尝试了以下帖子中的所有解决方案,但它们没有解决问题(浏览器报告相同的错误)

Web API 错误:“ObjectContent`1”类型无法序列化内容类型的响应正文

未能序列化内容类型的响应正文

Web API 错误:“ObjectContent`1”类型无法序列化内容类型的响应正文

这个错误到底是什么?

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();
    }
}
4

4 回答 4

6

IEnumerable<Message将 >更改为List<Message>

public IEnumerable<Message> GetAllMsg()
{
    return repo.GetAll();
}

public List<Message> GetAllMsg()
{
    return repo.GetAll();
}

更新:但要小心获取,OutOfMemoryException因为此方法会将所有Message对象存储在本地内存中,因此您必须实现某种分页。

于 2013-08-08T19:24:04.240 回答
3

我有同样的问题,这是我找到的解决方案

更新实体数据模型后,您必须ProxyCreationEnabledfalse模型中设置

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();
        }
}
于 2015-11-30T21:51:17.127 回答
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);
于 2015-03-11T21:37:59.907 回答
2

对于这些类型的数据查询,您绝对应该为结果创建分页。在 Web API 中,您有 2 个分页选项。

您可以使用 OData 从您的操作方法返回 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;
    }

}

上面的代码支持分页,您可以设置将从客户端返回的集合计数。

于 2013-08-17T06:23:04.067 回答