2012-11-20 62 views
8

我在asp.net web窗體應用程序中使用Ninject的2.2.0.0版本,並且在幾百次請求之後,它有時會在Binding類的GetProvider方法中拋出NullReferenceException異常。Ninject - Binding.GetProvider拋出NullReferenceException

例堆棧跟蹤:http://pastebin.com/BbhsPQMT

的例外只有當我強調測試應用程序和異常原因發生通常是不同的(不同的解決界面)。

爲了試圖理解爲什麼會出現這個問題,我查看了Ninject源代碼並插入了一些代碼行用於調試目的。我後來證實,null對象是Binding類中的ProviderCallback屬性。

我也將一些代碼放在ProviderCallback屬性的set操作符中,以便了解它是否被設置爲null。在運行一些測試並查看一些內存轉儲後,似乎ProviderCallback屬性沒有設置爲空值,因此我認爲GC收集的實例。

我仍然不明白爲什麼會發生這種情況...

任何幫助,非常感謝。

編輯:我們升級到Ninject的最新版本,只是爲了檢查是否異常仍發生,但我們得到了相同的異常壓力後測試的應用程序:http://pastebin.com/YaiaZndz

+0

你應該報告這一情況。 NullReferenceException總是表示引發它的代碼中的錯誤。 –

+0

嘗試更新到最新的Ninject版本。 –

回答

1

我不能告訴你的理由這個問題,因爲我不能重現這樣的行爲。但是,您可以採取一些步驟來確定問題。

正如您所說的問題是由ProviderCallbacknull引起的。這不能由GC引起,因爲GC不會將null分配給屬性。相反,你會得到一個已經處置的異常或其他奇怪的行爲。但也有一些其他的原因,這種情況發生:

  1. Null被分配在一定的時間,但由於您確認這已經這不是理由。
  2. 它從來沒有分配過。
  3. 稍後創建新的BindingConfiguration

通過在BindingConfiguration構造函數中添加一個斷點,可以很容易地驗證第三點。在內核成功配置並開始解析對象後,不應再調用它。

對於第二個問題的內核配置後,執行以下命令:

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

嗨雷莫。對不起,遲到的回覆,但我想看看你提供的任何條件是否屬實。第二次或第三次都沒有發生過。這被證明是非常難以重現的,因爲只發生每百次請求到aspx頁面。我看到的一件奇怪的事情是內存轉儲中的第二個StandardKernel,但我無法弄清楚它在哪裏被創建(!refs和!gcroot只將一個根返回給一個巨大的對象數組,似乎是appdomain的一個靜態成員 - 我仍然不明白爲什麼)。 –

+0

通過在內核的構造函數中添加一個斷點,你不能找出它的創建位置嗎? –

+0

雷莫,我發現它爲什麼被創造。在Ninject的第3版中,現在有一個Ninject.Web命名空間的依賴項,它在Ninject.Web.KernelContainer中創建StandardKernel impliclity。我現在回到我的原始問題。我不知道下一步該往哪裏看。讓我告訴你,我們還得到一些罕見的ActivationExceptions,一旦開始發生,他們將繼續被拋出,直到我們重新啓動應用程序池。我認爲這個問題可能是相關的。這發生在版本2.2中,並且我能夠在版本3中獲得罕見的ActivationExceptions(經過數百次請求) –

相關問題