I am working on mvc application which also has webapi. Application is throwing System.NullReference Exception in production.
(MVC 5, WebApi 2.0, .Net 4.5, Unity 3.0)
Error message
System.NullReferenceException: Object reference not set to an instance of an object. Stack trace at Unity.Mvc5.UnityDependencyResolver.DisposeOfChildContainer() at System.Web.HttpApplication.SyncEventExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() at System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously)
This is how the container is built and is called from Application_Start in global as UnityBootstrapper.Initialize(); -
public static class UnityBootstrapper { public static void Initialize() { var container = BuildUnityContainer(); DependencyResolver.SetResolver(new Unity.Mvc5.UnityDependencyResolver(container)); GlobalConfiguration.Configuration.DependencyResolver = new Unity.WebApi.UnityDependencyResolver(container); ControllerBuilder.Current.SetControllerFactory(new UnityMvcControllerFactory(container)); } private static IUnityContainer BuildUnityContainer() { var container = new UnityContainer(); // MVC/WebApi controller factories container.RegisterInstance<IHttpControllerActivator>(new UnityApiControllerActivator(container, new DefaultHttpControllerActivator())); // NHibernate sessions container.RegisterInstance<ISessionBuilder>(SessionBuilder.Instance); container.RegisterType<IClientCodeRequestContext, ClientCodeRequestContext>( new CurrentRequestContextLifetimeManager<IClientCodeRequestContext>()); container.RegisterType<IUnitOfWork, UnitOfWork>( new CurrentRequestContextLifetimeManager<IUnitOfWork>(), new InjectionConstructor(container.Resolve<ISessionBuilder>())); container.RegisterType<IUnitOfWorkContext>( new InjectionFactory(c => container.Resolve<IUnitOfWork>().CommonContext)); container.RegisterType<IUnitOfWorkClientContext>( new InjectionFactory( c => container.Resolve<IUnitOfWork>()[container.Resolve<IClientCodeRequestContext>().ClientCode])); //Repositories container.RegisterType<IUserRepository, UserRepository>(); //Business Logic container.RegisterType<IMembershipPrincipalBusiness, MembershipPrincipalBusiness>(); // Other container.RegisterType<IAuthenticationProvider, CoreMembershipProvider>(); return container; } }
In global.asax.cs-
protected void Application_PostAuthenticateRequest(object sender, EventArgs e)
{
var principalBusiness = DependencyResolver.Current.GetService<IMembershipPrincipalBusiness>();
}
The issue is in production only and is caught by newrelic.
Is the exception a bug in unity or something is missed in this implementation. I have been searching the issue since a week but could not get anything.