2010-12-10 13 views
5

Jestem hosting aplikacji, która używa AutoMapper do konwersji niektórych klas na inne. Wszystko działo się dobrze do dzisiaj. Aplikacja jest hostowana przez około 3 miesiące. W międzyczasie wykonaliśmy kilka wdrożeń, w których aplikacja została ponownie uruchomiona, ale usługi IIS tego nie zrobiły.AutoMapper 1.1 TworzenieMap podnosi wyjątek NullReferenceException po długim okresie bezczynności

znikąd wniosku rozpoczął się niepowodzeniem, patrząc na dzienników okazało się, że to jest przyczyną:

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]() 

Więc zmieniliśmy na naszym serwerze kopii zapasowych, które nie mają tego problemu w wszystko. Próbowaliśmy rozwiązać problem, ponownie uruchamiając aplikację, co nie pomogło. Tylko ponowne uruchomienie IIS rozwiązało problem.

Staraliśmy patrząc w źródle, aby dowiedzieć się, co jest przyczyną tego problemu, który mamy ściągnięty na https://github.com/jbogard/AutoMapper/. Wyjątek wydaje się być spowodowany w tej metodzie klasy ConfigurationStore AutoMapper.

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

_typeMaps jest zdefiniowany jako następujący w klasie.

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

Jeśli sprawdzić w TypeMap widzimy, że x.DestionationType i odniesienie x.SourceType do innych właściwości:

private readonly TypeInfo _destinationType; 
    private readonly TypeInfo _sourceType; 

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

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

Wygląda _sourceType i/lub _destionationType są nieważne al nagłe!

Czy ktoś w obliczu tego problemu i/lub czy ktoś wie możliwe przyczyny tego problemu i jak możemy temu zapobiec w przyszłości?

Odpowiedz

1

Gdybym może Automapper generalnie rzucać ten wyjątek, kiedy to Ben powiedział do mapowania coś jest (jako błąd wskazuje) null.

Na przykład, gdybyśmy mieli do powiedzenia:

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

Chcielibyśmy uzyskać ten sam błąd, ponieważ mówimy Automapper aby nowy MyNewObject z null MyCustomObject.

Od spojrzeń komunikatu o błędzie, sprawa wygląda pustym List. Oczekuje się, że Automapper będzie wiązał się z obiektami, które może odwzorować na coś innego, ale lista jest pusta.

Automapper może być nieco świni wytropić błędy, ponieważ błąd zostanie wyrzucony przez Automapper i wyglądać emisji Automapper. Oczywiście problem polega na tym, że gdzieś w jakiś sposób twój kod rzuca pustą listę do mapowania.

Czy wiesz, czy masz jakieś testy jednostkowe, które możesz zbadać? Jeśli tak, sprawdź zasięg kodu (np. NCover) i upewnij się, że cały twój kod mapowania jest wykorzystywany. Jeśli nie, pobierz kilka testów, aby to wykonać.

Alternatywą może być próba uruchomienia tej samej operacji na stacji roboczej programistycznej i próba odtworzenia sytuacji z błędem - może to być tabela bazy danych, która jest teraz pusta lub nieokreślone dane wprowadzone przez użytkownika.

Czy w swoim oprogramowaniu włączono jakieś logowanie, na przykład rejestrowanie na przykład Enterprise Library?

Powodzenia :)

Powiązane problemy