C# 使用WebAPI时出现序列化异常

C# 使用WebAPI时出现序列化异常,c#,asp.net-web-api,C#,Asp.net Web Api,我在尝试通过WebApi get返回列表时遇到SerializationException 这是我的密码: HomeController.cs: public IEnumerable<Article> Get() { return repo.GetArticles(); } public IEnumerable Get(){ 返回repo.GetArticles(); } Repository.cs: public List<Article> GetArti

我在尝试通过WebApi get返回列表时遇到SerializationException

这是我的密码:

HomeController.cs:

public IEnumerable<Article> Get() {
    return repo.GetArticles();
}
public IEnumerable Get(){
返回repo.GetArticles();
}
Repository.cs:

public List<Article> GetArticles() {
    using (var db = new ArticlesContext()) {
        return db.Articles.ToList();
    }
}
public List GetArticles(){
使用(var db=new ArticlesContext()){
返回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
    }
}
公共类文章{
[关键]
公共int ArticleID{get;set;}
公共字符串标题{get;set;}
public int UserID{get;set;}
[外键(“用户ID”)]
公共虚拟用户作者{get;set;}
}
公共类用户{
[关键]
public int UserID{get;set;}
[外国钥匙(“ArticleID”)]
公共虚拟列表项目{get;set;}
}
公共类文章上下文:DbContext{
公共DbSet项目{get;set;}
公共数据库集用户{get;set;}
public ArticlesContext():base(“name=conn”){
//等
}
}

返回列表而不是IEnumerable怎么样

public List<Article> Get() {
    return repo.GetArticles();
}
公共列表Get(){
返回repo.GetArticles();
}

大多数序列化问题通常源于正在提取的现有循环引用或与格式化相关的问题(即
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);          

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

有时,防止实体框架创建是有用的 代理实例。例如,序列化非代理实例非常重要 比序列化代理实例容易得多。代理创建 可以通过清除ProxyCreationEnabled标志来关闭。一个地方 您可以在上下文的构造函数中执行此操作。例如:

公共类BloggingContext:DbContext
{ 
公共博客上下文()
{ 
this.Configuration.ProxyCreationEnabled=false;
}  
公共数据库集博客{get;set;}
公共DbSet Posts{get;set;}
}

使用
AsEnumerable()
代替
ToList()

public IEnumerable GetArticles(){
使用(var db=new ArticlesContext()){
返回db.Articles.AsEnumerable();
}
}

SerializationException是否还有其他详细信息?看来你已经找到了更好的解决方案。
public class BloggingContext : DbContext 
{ 
    public BloggingContext() 
    { 
        this.Configuration.ProxyCreationEnabled = false; 
    }  

    public DbSet<Blog> Blogs { get; set; } 
    public DbSet<Post> Posts { get; set; } 
}
public IEnumerable<Article> GetArticles() {
    using (var db = new ArticlesContext()) {
        return db.Articles.AsEnumerable();
    }
}