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

Mik*_*ike 7 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]()
Run Code Online (Sandbox Code Playgroud)

所以我们切换到我们的备份服务器,它根本没有这个问题.我们尝试通过重新启动应用程序来解决问题,但没有帮助.只有重新启动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);
    }
Run Code Online (Sandbox Code Playgroud)

_typeMaps在类中定义如下.

    private readonly IList<TypeMap> _typeMaps = new List<TypeMap>();
Run Code Online (Sandbox Code Playgroud)

如果我们检查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; }
    }
Run Code Online (Sandbox Code Playgroud)

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

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

小智 1

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

例如,如果我们说:

MyCustomObject myobject = null;
MyNewObject mynewobject = Mapper.Map<MyCustomObject, MyNewObject>(myobject);
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

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

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

祝你好运 :)