我正在托管一个使用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突然变为空!
是否有其他人遇到此问题和/或是否有人知道此问题的可能原因以及我们如何防止此问题在未来发生?
答案 0 :(得分:1)
如果可以的话,Automapper通常会在被告知映射的内容(如错误所示)为null时抛出此异常。
例如,如果我们要说:
MyCustomObject myobject = null;
MyNewObject mynewobject = Mapper.Map<MyCustomObject, MyNewObject>(myobject);
我们会得到同样的错误,因为我们告诉Automapper从空MyNewObject
中创建一个新的MyCustomObject
。
从错误消息的外观来看,问题看起来像空List
。预计Automapper会将一堆对象映射到其他对象,但列表为空。
Automapper可以帮助追踪错误,因为Automapper会抛出错误并且看起来像Automapper问题。当然,问题是在某个地方,你的代码会以某种方式抛出一个空列表进行映射。
您知道您是否有可以检查的单元测试?如果是这样,请检查它们的代码覆盖率(类似NCover),并确保正在执行所有映射代码。如果没有,请编写一些测试来练习它。
另一种方法是尝试在开发工作站上运行相同的操作,并尝试使用错误重新创建情境 - 它可能是一个现在为空的数据库表,或者某些未指定的用户输入。
您的软件中是否启用了任何日志记录,例如Enterprise Library日志记录?
祝你好运:)