2013-08-08 30 views
8

Tôi sử dụng api Web để truy xuất dữ liệu từ cơ sở dữ liệu. Tôi chỉ có 1 bảng "tblMessage" và muốn lấy dữ liệu từ bảng đó.Luôn có lỗi "Loại ObjectContent 1 không thể tuần tự hóa nội dung phản hồi ..."

Tôi đã thiết lập mọi thứ nhưng sau đó khi tôi chạy trang web. lỗi luôn luôn nói

Các 'ObjectContent`1' loại thất bại trong việc sắp đặt từng cơ thể phản ứng cho loại nội dung 'application/xml

Tôi đọc một số bài viết trên stackoverflow rằng Sayid lỗi có thể được sửa chữa bởi yêu cầu trình duyệt xuất dữ liệu ở định dạng json. Sau đó, các lỗi trở nên

Các 'ObjectContent`1' loại thất bại trong việc sắp đặt từng cơ thể phản ứng cho loại nội dung 'application/json

Tôi đã thử tất cả các giải pháp từ các bài viết sau đây, nhưng họ không giải quyết vấn đề (trình duyệt báo cáo lỗi tương tự)

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

Lỗi chính xác này là gì?

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

Trả lời

5

Thay đổi IEnumerable<Message> để List<Message>

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

để

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

UPDATE: Nhưng hãy cẩn thận nhận OutOfMemoryException vì phương pháp này sẽ lưu trữ tất cả Message đối tượng trong bộ nhớ địa phương vì vậy bạn phải thực hiện một số loại phân trang.

+0

Cảm ơn. Tôi đọc một bài viết về vấn đề này và thêm cùng một điều nhưng trình duyệt báo cáo cùng một lỗi. Tôi nghĩ rằng lỗi phát sinh từ mã – kaboom

+0

@kaboom hãy thử câu trả lời cập nhật –

+0

Cảm ơn bạn lần nữa. Thật không may, mã của tôi không biên dịch b/c context.tblMessage trả về một DbSet, không phải Danh sách. Tôi đã thử "return context.tblMessage.ToList()" nhưng nó không thành công. – kaboom

2

Đối với các loại truy vấn dữ liệu này, bạn chắc chắn nên tạo phân trang cho kết quả. Bạn có 2 tùy chọn để phân trang trong API Web.

Tùy chọn đầu tiên bạn có thể sử dụng OData để trả về đối tượng IQueryable từ phương thức hành động của bạn. Vì vậy, hành động của bạn hỗ trợ phân trang.

Tùy chọn thứ hai là tạo bộ điều khiển hỗ trợ phân trang. Tôi đặt một ví dụ dưới đây.

[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; 
    } 

} 

Mã trên hỗ trợ phân trang và bạn có thể đặt số lượng bộ sưu tập sẽ trả về từ phía máy khách.

2

Tôi gặp vấn đề tương tự với Chrome, không nhiều với IE. Để khắc phục nó, tôi đã sử dụng các dòng sau tại Global.asax.cs, Application_Start() phương pháp:

GlobalConfiguration.Configuration.Formatters.JsonFormatter.SerializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore; 

GlobalConfiguration.Configuration.Formatters.Remove(GlobalConfiguration.Configuration.Formatters.XmlFormatter); 
1

tôi đã cùng một vấn đề và đây là giải pháp tôi thấy

Sau khi cập nhật Model Entity Data bạn phải thiết lập ProxyCreationEnabled để false trong Model của bạn

Configuration.ProxyCreationEnabled = false;

dụ của tôi:

public partial class EventsEntities : DbContext 
{ 
     public EventsEntities() 
      : base("name=EventsEntities") 
     { 
      Configuration.ProxyCreationEnabled = false; 
     } 
     protected override void OnModelCreating(DbModelBuilder modelBuilder) 
     { 
      throw new UnintentionalCodeFirstException(); 
     } 
} 
Các vấn đề liên quan