2013-08-08 16 views
8

Web APIを使用してデータベースからデータを取得します。私は1つのテーブル "tblMessage"しか持っておらず、そのテーブルからデータを取得したい。常に「ObjectContent 1タイプでレスポンス本文のシリアル化に失敗しました...」

私はすべてを設定しましたが、ウェブサイトを実行しました。エラーは常に

は「ObjectContent`1」タイプは、コンテンツタイプに対するレスポンスボディをシリアル化することができなかった私は、エラーがで固定することができsayid stackoverflowの上でいくつかの記事を読んで

「アプリケーション/ xmlの言いますjson形式でデータを出力するようにブラウザに指示します。その後、エラーは私は次のポストからのすべてのソリューションを試してみました

「アプリケーション/ jsonの「ObjectContent`1」タイプは、コンテンツタイプに対するレスポンスボディをシリアル化に失敗した

になりますが、それら(ブラウザが同じエラーを報告します)

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

答えて

5

変更IEnumerable<Message>List<Message>

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

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

に更新するには:あなたが持っているように、この方法は、ローカルメモリ内のすべての Messageオブジェクトを格納するため OutOfMemoryExceptionを得ることの しかし、注意してください何らかの種類のページングを実装します。

+0

ありがとうございます。私はこの問題についての記事を読んで同じことを追加しましたが、ブラウザは同じエラーを報告します。私はエラーがコードから生成すると思う。 – kaboom

+0

@kaboom更新された回答を試してください –

+0

もう一度ありがとう。残念ながら、私のコードはb/cをコンパイルしませんcontext.tblMessageはリストではなくDbSetを返します。私は "return context.tblMessage.ToList()"を試みたが失敗した。 – kaboom

2

これらの種類のデータを照会するには、必ず結果のページングを作成する必要があります。 Web APIのページングには2つのオプションがあります。

最初のオプションでは、ODataを使用してアクションメソッドからIQueryableオブジェクトを返すことができます。そのため、あなたのアクションはページングをサポートします。

2番目のオプションは、ページングをサポートするコントローラを作成することです。私はその一例を以下に載せた。

[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

私は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); 
1

私は同じ問題を抱えていたし、これは私がエンティティデータモデルを更新した後、あなたのモデルにfalse

ProxyCreationEnabledを設定する必要があり

を発見したソリューションです。 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(); 
     } 
} 
関連する問題