WebAPI 响应导致"System.OutOfMemoryException"



我开发了一个WebAPI服务,该服务在其响应中返回一个复杂的自定义对象的数组。他们的一些领域有许多与人的关系。例如:

[Table("OEReferences", Schema = "public")]
public class OEReference
{
    [NotMapped]
    public IList<IAReference> IAReferences{ get; set; }
}
[Table("IAReferences", Schema = "public")]
public class IAReference
{
    [NotMapped]
    public IList<OEReference> OEReferences{ get; set; }
}

每个一个性一个性对象都有一个iareference的列表,同时每个Iareference对象都有一个带有相应的iareference等列表等的一个性一个性一个性倾向(包括第一个)列表,而且永远不会停止。

有时我会得到记忆的例外。这是原因吗?我该如何防止它?

只有约50个一个处均包含其中的几个兴趣。其余的字段非常简单。我在.net 4.7.1中使用httpclient类。

看起来您正在直接从Web API返回实体框架对象(通过其内置JSON Serializer)。一般规则是永远不要做到这一点,因为JSON Serialializer将尝试序列化它可以找到的所有内容。但是,对于具有像您这样的关系的EF对象,它不知道在哪里停止,导致参考循环错误甚至是内存错误。

取而代

解决方案是创建对象/viewModels,以复制呼叫者需要的EF对象的各个部分,填写EF对象,然后返回它们。

一种快速和折叠的方法是使用匿名对象,例如:

// Instead of "return EF_Item":
return new
{
    Item = new
    {
        Id = EF_Item.Id,
        Description = EF_Item.Description,
        Things = MapThings(EF_Item.Things) // helper function that you need to provide
    }
};

一个良好的规则是仅分配从EF对象到ViewModel项目的简单属性(数字,Bool,String,DateTime)。一旦遇到另一个EF对象(或EF对象集合)的EF对象属性,则需要将其转换为未链接到EF的"简单"对象。

一种更具结构化的方法是使用ViewModel类,您可以通过使用诸如Automapper之类的工具(一旦配置)在任何需要时为您完成映射的工具,使其更加结构化。

>

相关内容

最新更新