2

我們有一個使用Unity 2.1.505.0的應用程序。我們的應用程序使用Web.API和自定義DependencyResolverAdapter爲我們的API控制器啓用依賴注入。在這個適配器內部,我們撥打方法IUnityContainer。但是,此調用間歇拋出NullReferenceExceptionIUnityContainer.CreateChildContainer()拋出NullReferenceException

NullReferenceException on CreateChildContainer() call

在什麼情況下該方法拋出一個NullReferenceException?堆棧跟蹤不顯露任何明顯的原因:

at Microsoft.Practices.Unity.UnityContainer..ctor(UnityContainer parent) 
at Microsoft.Practices.Unity.UnityContainer.CreateChildContainer() 
at MyApp.DependencyResolverAdapter.BeginScope() in C:\ResCollection\CropProtection\MyApp\MyApp\DependencyResolverAdapter.cs:line 43 
at System.Net.Http.HttpRequestMessageExtensions.GetDependencyScope(HttpRequestMessage request) 
at System.Web.Http.Dispatcher.DefaultHttpControllerActivator.GetInstanceOrActivator(HttpRequestMessage request, Type controllerType, Func`1& activator) 
at System.Web.Http.Dispatcher.DefaultHttpControllerActivator.Create(HttpRequestMessage request, HttpControllerDescriptor controllerDescriptor, Type controllerType) 

奇怪的是,做一個「清理解決方案」之後,應用程序正常工作約20-30秒;控制器由Unity正確解決,解析器似乎正在完成其工作。然後引發NullReferenceException,並且在應用程序的其餘生命週期內沒有成功解析控制器。在第一次解決控制器時,重新運行應用程序(不先清理)會導致此錯誤。

+1

「重新運行應用程序(不首先清理)」清理回收ASP.NET工作。重建部分在這裏不是關鍵。殺w3wp.exe完成同樣的事情。這看起來像是一些國家的腐敗。可能是一個線程錯誤。任何線程問題? – usr

+0

可能重複[什麼是NullReferenceException,我該如何解決它?](http://stackoverflow.com/questions/4660142/what-is-a-nullreferenceexception-and-how-doi-i-fix-it) – dotctor

+0

這對我來說是因爲我有一個IHttpHandlerFactory使用與WebApi DependencyResolver相同的容器。一旦我的IHttpHandlerFactory.ReleaseHandler()處理了容器,WebApi控制器就開始失敗。 解決方案是給處理程序一個單獨的容器。幸運的是,我不需要任何應用程序範圍的單身人士或任何東西。 – wtjones

回答

7

如果你看一下codeUnityContainer..ctor(UnityContainer parent),其中NullReferenceException可能出現的情況是該線路上唯一的地方:

parent.lifetimeContainer.Add(this); 

這是if (parent != null)裏面,這樣可以爲null這裏的唯一的事情就是parent.lifetimeContainerlifetimeContainerInitializeBuilderState中被初始化,這是從構造函數調用的,唯一的其他地方是在Dispose方法中。

所以這個錯誤很可能是因爲父容器已經被丟棄了。

這可能是Unity中的一個錯誤; CreateChildContainer應該檢查容器是否已經處置,如果有,則拋出ObjectDisposedException

+0

謝謝,這正是我正在尋找的。 –

相關問題