I have a controller in Web Api 2 and use Unity to inject dependencies into it. This seemed to work just fine until I suddenly got these exceptions in my log. The first two lines are from successful invocations of the controller (hundres of invocations prior worked just fine) and the remaining are from a failed invocations (there are hundreds of failed exceptions). What could trigger these exceptions during runtime when during the same run the controller also worked just fine? The application pool was recycled automatically (seen by the low ms number in the log) and the controller again worked fine (I guess until it again turns bad).
DEBUG 2016-04-07 04:33:56,611 50302443ms EventController Post [eaaa3010-36ec-4cba-b9c3-22035c62430a] - Received: ...
DEBUG 2016-04-07 04:33:56,611 50302443ms EventController Post [eaaa3010-36ec-4cba-b9c3-22035c62430a] - Parsed ...
ERROR 2016-04-07 06:08:58,424 56004256ms LogExceptionLogger LogAsync [(null)] - Global exception:
System.InvalidOperationException: An error occurred when trying to create a controller of type 'EventController'. Make sure that the controller has a parameterless public constructor. ---> System.ArgumentException: Type 'KamstrupEventReceiver.Controllers.EventController' does not have a default constructor
at System.Linq.Expressions.Expression.New(Type type)
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)
--- End of inner exception stack trace ---
at System.Web.Http.Dispatcher.DefaultHttpControllerActivator.Create(HttpRequestMessage request, HttpControllerDescriptor controllerDescriptor, Type controllerType)
at System.Web.Http.Controllers.HttpControllerDescriptor.CreateController(HttpRequestMessage request)
at System.Web.Http.Dispatcher.HttpControllerDispatcher.<SendAsync>d__1.MoveNext()
...
ERROR 2016-04-07 08:46:36,315 65462147ms LogExceptionLogger LogAsync [(null)] - Global exception:
System.InvalidOperationException: An error occurred when trying to create a controller of type 'EventController'. Make sure that the controller has a parameterless public constructor. ---> System.ArgumentException: Type 'KamstrupEventReceiver.Controllers.EventController' does not have a default constructor
at System.Linq.Expressions.Expression.New(Type type)
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)
--- End of inner exception stack trace ---
at System.Web.Http.Dispatcher.DefaultHttpControllerActivator.Create(HttpRequestMessage request, HttpControllerDescriptor controllerDescriptor, Type controllerType)
at System.Web.Http.Controllers.HttpControllerDescriptor.CreateController(HttpRequestMessage request)
at System.Web.Http.Dispatcher.HttpControllerDispatcher.<SendAsync>d__1.MoveNext()
DEBUG 2016-04-07 14:33:23,606 51408ms EventController Post [b88bada7-d81d-4bef-84d8-ce884cc3a010] - Received: ...
DEBUG 2016-04-07 14:33:23,887 51689ms EventController Post [b88bada7-d81d-4bef-84d8-ce884cc3a010] - Parsed ...
My controller is this:
[LogExceptionFilter]
public class EventController : ApiController
{
private static readonly ILog log4 = LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
private IEventMapping _eventMapping;
private IMessageQueue _messageQueue;
private IMapper _mapper;
public EventController(IEventMapping eventMapping, IMessageQueue messageQueue, IMapper mapper)
{
_eventMapping = eventMapping;
_messageQueue = messageQueue;
_mapper = mapper;
}
// POST: api/Event
[HttpPost]
public IHttpActionResult Post([FromBody]Event @event) { ... }
and Unity is registered like this in WebApiConfig.cs:
var container = new UnityContainer();
container.RegisterType<IEventMapping, EventMapping>(new HierarchicalLifetimeManager());
container.RegisterType<IMessageQueue, MessageQueue>(new HierarchicalLifetimeManager());
container.RegisterInstance<IMapper>(new MapperConfiguration(cfg => {
cfg.CreateMap<Event, EventDTO>();
}).CreateMapper());
config.DependencyResolver = new UnityResolver(container);
config.Filters.Add(new LogExceptionFilterAttribute());
config.Services.Add(typeof(IExceptionLogger), new LogExceptionLogger());
This is the UnityResolver:
public class UnityResolver : IDependencyResolver
{
protected IUnityContainer container;
public UnityResolver(IUnityContainer container)
{
if (container == null)
{
throw new ArgumentNullException("container");
}
this.container = container;
}
public object GetService(Type serviceType)
{
try
{
return container.Resolve(serviceType);
}
catch (ResolutionFailedException)
{
return null;
}
}
public IEnumerable<object> GetServices(Type serviceType)
{
try
{
return container.ResolveAll(serviceType);
}
catch (ResolutionFailedException)
{
return new List<object>();
}
}
public IDependencyScope BeginScope()
{
var child = container.CreateChildContainer();
return new UnityResolver(child);
}
public void Dispose()
{
container.Dispose();
}
}