c# - AutoMapper 的 1.1 CreateMap 在长时间运行后引发 NullReferenceException

标签 c# automapper

我正在托管一个使用 AutoMapper 将某些类转换为其他类的应用程序。直到今天这一切都很好。该应用程序现已托管大约 3 个月。在此期间,我们进行了几次部署,其中应用程序已重新启动,但 IIS 没有。

应用程序不知从何而来开始失败,回顾日志我们发现这是原因:

    System.NullReferenceException: Object reference not set to an instance of an object.
   at AutoMapper.Configuration.<>c__DisplayClass13.<FindExplicitlyDefinedTypeMap>b__12(TypeMap x)
   at System.Linq.Enumerable.FirstOrDefault[TSource](IEnumerable`1 source, Func`2 predicate)
   at AutoMapper.Configuration.FindExplicitlyDefinedTypeMap(Type sourceType, Type destinationType)
   at AutoMapper.Configuration.CreateTypeMap(Type source, Type destination, String profileName)
   at AutoMapper.Configuration.CreateMap[TSource,TDestination](String profileName)
   at AutoMapper.Configuration.CreateMap[TSource,TDestination]()
   at AutoMapper.Mapper.CreateMap[TSource,TDestination]()

所以我们切换到我们的备份服务器,完全没有这个问题。 我们试图通过重新启动应用程序来解决问题,但没有帮助。只有重新启动 IIS 才能解决问题。

我们尝试查看源代码以找出导致此问题的原因,我们在 https://github.com/jbogard/AutoMapper/ 下载了源代码.异常好像是AutoMapper的ConfigurationStore类的这个方法引起的。

    private TypeMap FindExplicitlyDefinedTypeMap(Type sourceType, Type destinationType)
    {
        return _typeMaps.FirstOrDefault(x => x.DestinationType == destinationType && x.SourceType == sourceType);
    }

_typeMaps 在类中定义如下。

    private readonly IList<TypeMap> _typeMaps = new List<TypeMap>();

如果我们检查 TypeMap,我们会看到 x.DestionationType 和 x.SourceType 引用了其他属性:

    private readonly TypeInfo _destinationType;
    private readonly TypeInfo _sourceType;

    public Type SourceType
    {
        get { return _sourceType.Type; }
    }

    public Type DestinationType
    {
        get { return _destinationType.Type; }
    }

看起来 _sourceType 和/或 _destionationType 突然为空!

有没有其他人遇到过这个问题和/或有没有人知道这个问题的可能原因以及我们如何才能防止这种情况在未来发生?

最佳答案

如果可以的话,当 Automapper 被告知要映射某些内容(如错误所示)为 null 时,它通常会抛出此异常。

例如,如果我们要说:

MyCustomObject myobject = null;
MyNewObject mynewobject = Mapper.Map<MyCustomObject, MyNewObject>(myobject);

我们会得到同样的错误,因为我们告诉 Automapper 从空的 MyCustomObject 中创建一个新的 MyNewObject

从错误消息的外观来看,问题看起来像一个空的 List。 Automapper 需要一堆可以映射到其他对象的对象,但列表是空的。

Automapper 可能很难追踪其中的错误,因为错误将由 Automapper 抛出并且看起来像是 Automapper 问题。自然地,问题是在某处,您的代码以某种方式抛出一个空列表以进行映射。

您知道您是否有可以检查的单元测试吗?如果是这样,请检查它们的代码覆盖率(类似于 NCover )并确保正在执行所有映射代码。如果没有,请编写一些测试来练习它。

另一种方法可能是尝试在开发工作站上运行相同的操作并尝试重新创建出现错误的情况 - 它可能是现在为空的数据库表,或者一些未指定的用户输入。

您的软件中是否启用了任何日志记录,例如 Enterprise Library例如日志记录?

祝你好运:)

关于c# - AutoMapper 的 1.1 CreateMap 在长时间运行后引发 NullReferenceException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4406985/

相关文章:

c# - 将动态 C# 对象序列化为 JSON

asp.net-mvc - AutoMapper.CreateMaps放置在哪里?

c# - .NET 有类似 Java 的 permgen 的东西吗?

c# - 取消不接受 CancellationToken 的异步操作的正确方法是什么?

c# - 如何验证日期时间

c# - 有序数据结构,允许有效删除重复项

c# - AutoMapper - 将源对象映射到嵌套对象

c# - AutoMapper - 自定义对象列表的 int 数组

linq - AutoMapper ProjectTo 因 FirstOrDefault 失败

c# - 按照惯例使用 AutoMapper 将 Wrapper<T> 映射到 T'