Just to give a quick background:
- It works locally, but not when deployed to the server (windows server 2002) via TeamCity and Octopus
- I have extracted the nuget packge generate by TC and published locally, and also works fine
- I have googled a lot in the past few days
- Have tried many solutions
- My deployed Api run under specific AppPool
- My local machine is a Windows 10
I have an web api application, coded on .net framework 4.6, and have some dependency injection using Unity on one of my controllers. I am registering the dependencies on the WebApiConfig, in the Register method, as it follows:
public static void Register(HttpConfiguration config)
{
// Web API configuration and services
var container = new UnityContainer();
var logger = new LoggerFactory().CreateLogger();
container.RegisterInstance(logger);
container.RegisterType<IEventStoreConnection>(new InjectionFactory(c => PaymentRegistry.CreateEventStoreConnection(logger)));
container.RegisterType<IAggregateRepository, AggregateRepository>(new HierarchicalLifetimeManager());
container.RegisterType<IPaymentRepository, PaymentRepository>(new HierarchicalLifetimeManager());
container.RegisterType<ICertificateRepository, CertificateRepository>(new HierarchicalLifetimeManager());
container.RegisterType<ISaxoCallMetadataRepository, SaxoCallMetadataRepository>(new HierarchicalLifetimeManager());
container.RegisterType<ISaxoCallMetadataService, SaxoCallMetadataService>(new HierarchicalLifetimeManager());
container.RegisterType<ISaxoConvert, SaxoConvert>(new HierarchicalLifetimeManager());
container.RegisterType<IPackageService, PackageService>(new HierarchicalLifetimeManager());
container.RegisterType<ISaxoValidationStageOneService, SaxoValidationStageOneResponseService>(new HierarchicalLifetimeManager());
container.RegisterType<ISaxoValidationStageTwoService, SaxoValidationStageTwoResponseService>(new HierarchicalLifetimeManager());
container.RegisterType<ISaxoValidationService, SaxoValidationService>(new HierarchicalLifetimeManager());
container.RegisterType<ISaxoEndOfDayResponseService, SaxoEndOfDayResponseService>(new HierarchicalLifetimeManager());
container.RegisterType<ISaxoService, SaxoService>(new HierarchicalLifetimeManager());
container.RegisterType<IAggregateRoot, PaymentAggregate>(new HierarchicalLifetimeManager());
container.RegisterType<IExceptionLogger, SerilogExceptionLogger>(new HierarchicalLifetimeManager());
container.RegisterType<IAuthenticationService, AuthenticationService>();
// Web API routes
config.DependencyResolver = new UnityResolver(container);
config.MapHttpAttributeRoutes();
config.Filters.Add(new GlobalExceptionFilterAttribute());
config.Filters.Add(new AuthorizeAttribute());
config.Filters.Add(new ApiKeyAuthenticationFilter(container.Resolve<IAuthenticationService>()));
config.Services.Add(typeof(IExceptionLogger), container.Resolve<IExceptionLogger>());
config.Formatters.Remove(config.Formatters.XmlFormatter);
config.Formatters.JsonFormatter.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver();
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "{controller}/{action}/{batchPaymentId}",
defaults: new { batchPaymentId = RouteParameter.Optional }
);
}
When I make a request with Postman, I am getting that famous Make sure that the controller has a parameterless public constructor error:
{
"message": "An error has occurred.",
"exceptionMessage": "An error occurred when trying to create a controller of type 'SaxoPaymentController'. Make sure that the controller has a parameterless public constructor.",
"exceptionType": "System.InvalidOperationException",
"stackTrace": " at System.Web.Http.Dispatcher.DefaultHttpControllerActivator.Create(HttpRequestMessage request, HttpControllerDescriptor controllerDescriptor, Type controllerType)\r\n at System.Web.Http.Controllers.HttpControllerDescriptor.CreateController(HttpRequestMessage request)\r\n at System.Web.Http.Dispatcher.HttpControllerDispatcher.<SendAsync>d__1.MoveNext()",
"innerException": {
"message": "An error has occurred.",
"exceptionMessage": "Type 'Payments.SaxoIntegration.Api.Controllers.SaxoPaymentController' does not have a default constructor",
"exceptionType": "System.ArgumentException",
"stackTrace": " at System.Linq.Expressions.Expression.New(Type type)\r\n at System.Web.Http.Internal.TypeActivator.Create[TBase](Type instanceType)\r\n at System.Web.Http.Dispatcher.DefaultHttpControllerActivator.GetInstanceOrActivator(HttpRequestMessage request, Type controllerType, Func`1& activator)\r\n at System.Web.Http.Dispatcher.DefaultHttpControllerActivator.Create(HttpRequestMessage request, HttpControllerDescriptor controllerDescriptor, Type controllerType)"
}
}
Anyone has any idea of how to fix it? Let me know if you need further details on that.