【发布时间】:2018-03-21 16:03:37
【问题描述】:
只是为了简要介绍一下背景:
- 它在本地工作,但在通过 TeamCity 和 Octopus 部署到服务器(windows server 2002)时不起作用
- 我已经提取了TC生成的nuget包并在本地发布,也可以正常工作
- 这几天我google了很多
- 尝试了很多解决方案
- 我部署的 Api 在特定的 AppPool 下运行
- 我的本地机器是 Windows 10
我有一个 web api 应用程序,在 .net 框架 4.6 上编码,并且在我的一个控制器上使用 Unity 进行了一些依赖注入。 我在 Register 方法中注册了 WebApiConfig 上的依赖项,如下所示:
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 }
);
}
当我向 Postman 发出请求时,我得到了那个著名的确保控制器有一个无参数的公共构造函数错误:
{
"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)"
}
}
有人知道如何解决吗? 如果您需要更多详细信息,请告诉我。
【问题讨论】:
-
你如何在本地和服务器上托管它?您的 Register 方法是从哪里调用的?根据您的托管环境以及您从哪里调用它,它可能不会被调用。我建议在此处添加一些日志记录以确认它正在被调用。
-
@Steven,它没有重复,因为它在本地工作,问题是部署到服务器时
-
我仍然认为该链接可以为您提供答案,因为“发生的事情是您没有在容器中明确注册控制器”。
-
@Kell 在本地,我在 IIS 上创建了一个 Web 应用程序并指向我的项目文件夹,还尝试将 dll 和内容发布到一个文件夹,然后指向该文件夹。两种方式都在本地工作。在服务器上托管在 IIS 上。 TeamCity 正在进行构建/nuget 打包,然后通过 Octopus 进行部署。本地机器和服务器都安装了相同的 .net 框架。日志是一个很好的喊声 - 将在 Register 方法中添加一些内容。
标签: c# .net asp.net-web-api dependency-injection asp.net-web-api2