2012-11-20 13 views
8

Używam wersji 2.2.0.0 programu Ninject w aplikacji formularzy WWW asp.net i po kilkuset żądaniach, czasami generuje wyjątek NullReferenceException w metodzie GetProvider klasy Binding.Ninject - Binding.GetProvider generuje wyjątek NullReferenceException

Przykład stos śledzenia: http://pastebin.com/BbhsPQMT

Wyjątek występuje tylko wtedy, kiedy podkreślić testowanie aplikacji i pochodzenie wyjątkiem zwykle różne (rozwiązanie różne interfejsy).

Aby zrozumieć przyczynę tego problemu, sprawdziłem kod źródłowy Ninject i wstawiłem kilka linii kodu do celów debugowania. Później potwierdziłem, że obiekt o wartości NULL to właściwość ProviderCallback w klasie Powiązanie.

Wprowadziłem również kod do operatora set właściwości ProviderCallback, aby zrozumieć, czy był ustawiony na wartość null. Po wykonaniu niektórych testów i przejrzeniu niektórych zrzutów pamięci wydaje się, że właściwość ProviderCallback nie jest ustawiona na wartość pustą, więc myślę, że instancja jest gromadzona przez GC.

ja nadal nie rozumiem, dlaczego tak się dzieje ...

Każda pomoc jest mile widziana.

Edit: Zostaliśmy przeniesieni do najnowszej wersji Ninject po prostu sprawdzić, czy wyjątek nadal występuje, ale mamy ten sam wyjątek po stresie testowania aplikacji: http://pastebin.com/YaiaZndz

+0

Należy zgłosić. Wyjątek NullReferenceException zawsze wskazuje błąd w kodzie, który go wyrzuca. –

+0

Spróbuj zaktualizować do najnowszej wersji Ninject. –

Odpowiedz

1

Nie mogę powiedzieć ci przyczynę ten problem, ponieważ nie mogę odtworzyć takiego zachowania. Ale oto kilka kroków, które możesz podjąć, aby zidentyfikować problem.

Jak twierdzisz, problem jest spowodowany przez ProviderCallback, czyli null. Nie może to być spowodowane przez GC, ponieważ GC nigdy nie przypisze do właściwości wartości null. Zamiast tego otrzymasz już zastrzeżony wyjątek lub inne dziwne zachowania. Ale są też inne powody, jak może się to zdarzyć:

  1. Null jest przypisane na jakiś czas, ale skoro to zweryfikowane już nie jest powód.
  2. To nigdy nie było przydzielone w ogóle.
  3. Nowy BindingConfiguration zostanie utworzony później.

Trzeci punkt można łatwo zweryfikować, dodając punkt przerwania w konstruktorze BindingConfiguration. Nie powinno już być wywoływane po pomyślnym skonfigurowaniu jądra i rozpoczęciu rozwiązywania obiektów.

Dla drugiego problemu wykonać następującą po konfiguracji jądra:

var kernel = your fully configured kernel; 
var bindingsField = typeof(KernelBase).GetField("bindings", BindingFlags.NonPublic | BindingFlags.Instance); 
var bindings = bindingsField.GetValue(kernel) as IEnumerable<KeyValuePair<Type, ICollection<IBinding>>>; 

foreach (var bindingsEntry in bindings 
    .Where(bindingsEntry => bindingsEntry.Value 
     .Any(binding => binding.BindingConfiguration.ProviderCallback == null))) 
{ 
    throw new Exception(string.Format("No Provider callback defined for {0}.", bindingsEntry.Key)); 
} 
+0

Hi Remo. Przepraszamy za spóźnioną odpowiedź, ale próbowałem sprawdzić, czy którykolwiek z podanych warunków jest prawdziwy. Ani druga, ani trzecia nigdy się nie wydarzyły. Jest to bardzo trudne do odtworzenia, ponieważ zdarza się tylko co sto wniosków do strony aspx. Jedną z dziwnych rzeczy, które zobaczyłem, był drugi StandardKernel w zrzucie pamięci, ale nie mogłem ustalić, gdzie jest tworzony (! Refs i!gcroot zwrócił tylko root do ogromnej liczby obiektów, które wydają się być statycznym członkiem appdomain - wciąż nie rozumiem dlaczego). –

+0

Nie możesz dowiedzieć się, gdzie jest tworzony, dodając punkt przerwania w konstruktorze jądra? –

+0

Remo, Znalazłem, dlaczego został stworzony. W wersji 3 programu Ninject istnieje teraz zależność od przestrzeni nazw Ninject.Web, która powoduje niejawność StandardKernel w produkcie Ninject.Web.KernelContainer. Wracam do pierwotnego wydania. Nie mam pojęcia, gdzie szukać dalej. Pozwolę sobie tylko powiedzieć, że otrzymujemy także kilka rzadkich wyjątków ActivationExceptions, które po ich rozpoczęciu są w dalszym ciągu zgłaszane, dopóki nie zrestartujemy puli aplikacji. Myślę, że te problemy mogą być powiązane. Dzieje się to w wersji 2.2 i udało mi się również uzyskać rzadkie Wyjątki ActivationExceptions w wersji 3 (po setkach żądań). –

Powiązane problemy