2013-08-08 10 views
8

Używam interfejsu API do pobierania danych z bazy danych. Mam tylko 1 tabelę "tblMessage" i chcę pobrać dane z tej tabeli.Zawsze występuje błąd "Typ obiektu ObjectContent 1 nie może serializować treści odpowiedzi ..."

Ustawiłem wszystko, ale potem, gdy uruchomię stronę. błąd zawsze powiedzieć

typu „ObjectContent`1” nie szeregować ciało odpowiedzi dla typu zawartości „application/xml

czytałem kilka postów na StackOverflow że Sayid błąd może być ustalona przez mówiąc przeglądarce, aby wyprowadzała dane w formacie json. Po tym, błąd staje

wpisać „ObjectContent`1” nie szeregować ciało odpowiedzi dla typu zawartości „application/json

Próbowałem wszystkie rozwiązania z następujących stanowisk, ale nie rozwiąże problemu (przeglądarka zgłasza ten sam błąd)

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

Czym dokładnie jest ten błąd?

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

Odpowiedz

5

Zmień IEnumerable<Message> do List<Message>

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

do

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

UPDATE: Ale strzeżcie się OutOfMemoryException ponieważ ta metoda będzie przechowywać wszystkie Message obiektów w pamięci lokalnej, więc trzeba zaimplementować pewien rodzaj stronicowania.

+0

Dzięki. Przeczytałem post o tym problemie i dodałem to samo, ale przeglądarka zgłasza ten sam błąd. Myślę, że błąd generuje kod – kaboom

+0

@kaboom spróbuj zaktualizować odpowiedź –

+0

Jeszcze raz dziękuję. Niestety mój kod nie kompiluje b/c context.tblMessage zwraca DbSet, a nie List. Próbowałem "return context.tblMessage.ToList()", ale nie udało się. – kaboom

2

W przypadku tego typu zapytań danych zdecydowanie powinieneś utworzyć stronicowanie dla wyników. Masz 2 opcje stronicowania w Web API.

Pierwsza opcja polegająca na użyciu OData do zwrócenia obiektu IQueryable z metody akcji. Dzięki temu twoje działanie obsługuje stronicowanie.

Drugą opcją jest utworzenie kontrolera obsługującego stronicowanie. Podam przykład poniżej.

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

} 

Powyższy kod obsługuje stronicowanie i można ustawić licznik kolekcji, który ma powrócić ze strony klienta.

2

Miałem ten sam problem z Chrome, nie tyle z IE. Aby to naprawić użyłem następujących linii w Global.asax.cs, Application_Start() metoda:

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

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

miałem ten sam problem i jest to rozwiązanie znalazłem

Po aktualizacji modelu Entity Data trzeba ustawić ProxyCreationEnabled do false w Modelu

Configuration.ProxyCreationEnabled = false;

Mój przykład:

public partial class EventsEntities : DbContext 
{ 
     public EventsEntities() 
      : base("name=EventsEntities") 
     { 
      Configuration.ProxyCreationEnabled = false; 
     } 
     protected override void OnModelCreating(DbModelBuilder modelBuilder) 
     { 
      throw new UnintentionalCodeFirstException(); 
     } 
}