C# 对象可以';无法转换为JSon

C# 对象可以';无法转换为JSon,c#,asp.net,asp.net-web-api,entity-framework-5,json.net,C#,Asp.net,Asp.net Web Api,Entity Framework 5,Json.net,我在EntityFramework5代码优先数据库和Json序列化中遇到了这个perculiar问题 我有一个具有以下用户类的数据库 public class User { [Key()] [HiddenInput(DisplayValue=false)] public int UserId { get; set; } [Required] public string Username { get; set; } [Required]

我在EntityFramework5代码优先数据库和Json序列化中遇到了这个perculiar问题

我有一个具有以下用户类的数据库

public class User
{
    [Key()]
    [HiddenInput(DisplayValue=false)]
    public int UserId { get; set; }

    [Required]
    public string Username { get; set; }

    [Required]
    public string DisplayName { get; set; }

    [Required]
    [DataType(DataType.Password)]
    public string Password { get; set; }

    [DataType(DataType.MultilineText)]
    public string Description { get; set; }

    [ScaffoldColumn(false)]
    public virtual Outfit ProfileOutfit { get; set; }

    [ScaffoldColumn(false)]
    public virtual PoseAnimation ProfilePose { get; set; }

    [ScaffoldColumn(false)]
    public virtual Mannequin ProfileMannequin { get; set; }

    [ScaffoldColumn(false)]
    public virtual ICollection<int> SubscribedTo { get; set; }

    [ScaffoldColumn(false)]
    public virtual ICollection<Fashionshow> Fashionshows { get; set; }

    [ScaffoldColumn(false)]
    public virtual ICollection<Outfit> Outfits { get; set; }

    [ScaffoldColumn(false)]
    public virtual ICollection<Snapshot> Snapshots { get; set; }

    [ScaffoldColumn(false)]
    public virtual ICollection<Achievement> Achievements { get; set; }
}
我不知道该怎么做才对。我已经尝试过从其他对象中删除对User类的所有引用,以防在某个地方出现无休止的循环,但没有任何帮助。我还尝试关闭和打开这段代码(这也没有帮助):

我猜我是在转换为JSon时出错的,因为get方法中没有捕捉到错误

简而言之,我有一个对象在本地主机上序列化为Json,但在IIS服务器上没有。如何解决这个问题

更新 我无法记录它(据我所知,我对IIS不是很熟悉),因为API中的get方法似乎可以工作。这是:

public IEnumerable<object> GetUsers()
    {
        IEnumerable<User> users;

        try
        {
            users = db.Users.AsEnumerable();
        }
        catch
        {
            return new List<string>() { "Error getting the collection" };
        }

        try
        {
            return users;
        }
        catch
        {
            return new List<string>() { "Error returning the collection" };
        }
    }
public IEnumerable GetUsers()
{
i无数用户;
尝试
{
users=db.users.AsEnumerable();
}
抓住
{
返回新列表(){“获取集合时出错”};
}
尝试
{
返回用户;
}
抓住
{
return new List(){“返回集合时出错”};
}
}

由于两个错误字符串都没有返回,我猜实际用户都返回了,而序列化为JSon是错误的。我通过访问/api/users获得用户。

您没有发布足够的代码让我知道是否存在这种情况,因此这是一个猜测:我在通过MVC ActionResults序列化EF Entite时看到了以下问题:

在释放数据库集之前,需要完全实现LINQ查询(即执行SQL并将其转换为实体)。作为ActionResult的一部分返回一个非物质化的IQueryable是相当容易的,并且通常在Action方法返回之前处理DbSet。当序列化程序试图枚举结果中的某个集合时,这会导致查询在返回语句后爆炸,从而导致LINQ查询执行


如果这是您的问题,解决方案是在处理DbSet之前通过调用ToList()或ToArray()确保IQueryable已具体化。

您没有发布足够的代码让我知道是否是这种情况,因此这是一个猜测:我在通过MVC ActionResults序列化EF Entite时看到了以下问题:

在释放数据库集之前,需要完全实现LINQ查询(即执行SQL并将其转换为实体)。作为ActionResult的一部分返回一个非物质化的IQueryable是相当容易的,并且通常在Action方法返回之前处理DbSet。当序列化程序试图枚举结果中的某个集合时,这会导致查询在返回语句后爆炸,从而导致LINQ查询执行


如果这是您的问题,解决方案是在处理DbSet之前,通过调用ToList()或ToArray()确保IQueryable已具体化。

尝试获取错误的详细信息,把它记录在某个地方。你还没有展示你是如何试图请求一个
用户
作为JSON对象的。顺便说一句,
发生了一个错误。
可能意味着一百万件不同的事情,没有必要进行JSON转换。我知道,但这基本上是我所有的信息,因为它不会在我的常规开发环境中崩溃,我不知道如何从IISTry中提取日志以获得错误的详细信息,把它记录在某个地方。你还没有展示你是如何试图请求一个
用户
作为JSON对象的。顺便说一句,
发生了一个错误。
可能意味着一百万件不同的事情,没有必要进行JSON转换。我知道,但这基本上是我所有的信息,因为它不会在我的常规开发环境中崩溃,我不知道如何从IISCan中提取日志。你可以看看添加的代码,看看这是否是问题所在?在返回它之前,我正在使用.AsEnumerable()。AsEnumerable()将不会导致查询执行,您需要调用ToArray()或ToList(),或者执行一些实际枚举IEnumerable(foreach等)的代码,顺便说一句,如果您要在执行时附加调试器并启用“引发异常时中断”对于CLR异常,您可能会看到一些关于正在发生什么的有用信息。这可在“调试|异常”菜单中找到。在生产中可能不实用,但是您可以强制您的DbSet在您的开发机器上进行处理,并查看是否存在相同类型的错误。ToList()工作正常,谢谢,尽管它在我的开发机器上工作,但我仍然认为这很奇怪。你知道为什么吗?操作系统版本(服务器与工作站)和硬件(CPU内核数量)的不同会影响多线程的计时。您是让垃圾收集器清理您的DbSet,还是在某个地方显式地处理它?如果由GC来决定,我预计会出现这样的间歇性故障。如果显式地处理in-End_请求或类似的内容,则这可能发生在响应序列化以外的其他线程中,并且无论出于何种原因,服务器线程调度程序都会在序列化程序运行之前提前处理。您可以查看添加的代码,看看这是否是问题所在吗?在返回它之前,我正在使用.AsEnumerable()。AsEnumerable()将不会导致查询执行,您需要调用ToArray()或ToList(),或者执行一些实际枚举IEnumerable(foreach等)的代码,顺便说一句,如果您要在执行时附加调试器并启用“引发异常时中断”对于CLR异常,您可能会看到一些关于正在发生什么的有用信息。这可在“调试|异常”菜单中找到。在生产中可能不切实际,但您可以强制您的DbSet在您的计算机上进行处理
{"$id":"1","Message":"An error has occurred."}
var json = config.Formatters.JsonFormatter;
        json.SerializerSettings.PreserveReferencesHandling = Newtonsoft.Json.PreserveReferencesHandling.Objects;
        config.Formatters.Remove(config.Formatters.XmlFormatter);
public IEnumerable<object> GetUsers()
    {
        IEnumerable<User> users;

        try
        {
            users = db.Users.AsEnumerable();
        }
        catch
        {
            return new List<string>() { "Error getting the collection" };
        }

        try
        {
            return users;
        }
        catch
        {
            return new List<string>() { "Error returning the collection" };
        }
    }