2016-04-10 17 views
2

WebApi getを使用してリストを返すときにSerializationExceptionが発生します。WebAPIを使用しているときにSerializationExceptionが発生する

Full error message on pastebin

ここに私のコードです:

HomeController.cs:

public IEnumerable<Article> Get() { 
    return repo.GetArticles(); 
} 

Repository.cs:

public List<Article> GetArticles() { 
    using (var db = new ArticlesContext()) { 
     return db.Articles.ToList(); 
    } 
} 

ArticlesContext.cs:

public class Article { 
    [Key] 
    public int ArticleID { get; set; } 
    public string Title { get; set; } 
    public int UserID { get; set; } 

    [ForeignKey("UserID")] 
    public virtual User Author { get; set; } 
} 

public class User { 
    [Key] 
    public int UserID { get; set; } 

    [ForeignKey("ArticleID")] 
    public virtual List<Article> Articles { get; set; } 
} 

public class ArticlesContext : DbContext { 
    public DbSet<Article> Articles { get; set; } 
    public DbSet<User> Users { get; set; } 

    public ArticlesContext() : base("name=conn") { 
     //etc 
    } 
} 
+0

あなたはSerializationExceptionに関する追加の詳細情報を持っていますか? –

答えて

0

何のリストを返す代わりにIEnumerableを

について
public List<Article> Get() { 
    return repo.GetArticles(); 
} 
+0

それは効果がありません – johndoe33

1

ほとんどのシリアル化の問題は、一般的に引っ張られたり、フォーマットに関連する問題されている既存の循環参照のいずれかから生じる(すなわち、 JSON,XMLなど)。あなたがプロキシ生成と遅延ロードなどのプロパティが有効になっているかどうかを確認し、あなたのDbContextのコンストラクタ内の問題を解決しようとするためにそれらを無効にすることができ

this.Configuration.LazyLoadingEnabled = false; 
this.Configuration.ProxyCreationEnabled = false; 

あなたのGlobal.asax以内に次のセクションを追加してみてくださいすることができます

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

およびその他の明示的にXMLシリアル化を無視する:

循環参照を処理するためのファイル
GlobalConfiguration.Configuration.Formatters.Remove(GlobalConfiguration.Configuration.Formatters.XmlFormatter);   
+0

あなたはもっと良い解決策で私にそれを打つように見えます。 –

0

エラーメッセージに基づいて、プロキシクラスのシリアル化に問題があるようです。プロキシの生成を無効にすることができます。

時々、エンティティフレームワークが プロキシインスタンスを作成しないようにすると便利です。たとえば、非プロキシインスタンスのシリアル化は、プロキシインスタンスのシリアル化よりもかなり容易です( )。プロキシの作成 は、ProxyCreationEnabledフラグをクリアすることでオフにすることができます。 1つの場所 これはあなたのコンテキストのコンストラクタにあります。たとえば、次のように

public class BloggingContext : DbContext 
{ 
    public BloggingContext() 
    { 
     this.Configuration.ProxyCreationEnabled = false; 
    } 

    public DbSet<Blog> Blogs { get; set; } 
    public DbSet<Post> Posts { get; set; } 
} 

https://msdn.microsoft.com/en-us/data/jj592886.aspx

0

使用AsEnumerable()代わりToList()

public IEnumerable<Article> GetArticles() { 
    using (var db = new ArticlesContext()) { 
     return db.Articles.AsEnumerable(); 
    } 
} 
関連する問題