使用WebAPI时出现SerializationException

时间:2016-04-10 01:16:26

标签: c# asp.net-web-api

尝试通过WebApi get返回列表时,我收到了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
    }
}

3 个答案:

答案 0 :(得分:0)

如何返回List而不是IEnumerable

<cfif success>
  <cfset result ='{"sent":"yes"}'> 
<cfelse>
   <cfset result ='{"sent":"no"}'>
</cfif>

答案 1 :(得分:0)

根据错误消息,似乎序列化代理类时出现问题。您可以尝试关闭代理生成。

  

有时阻止实体框架的创建很有用   代理实例。例如,序列化非代理实例是   比序列化代理实例容易得多。代理创建   可以通过清除ProxyCreationEnabled标志来关闭。一个地方   你可以这样做是在你的上下文的构造函数。例如:

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

答案 2 :(得分:0)

使用AsEnumerable()代替ToList()

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