Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/260.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Autofac AutofacControllerConfiguration失败,HttpControllerDescriptorTracer空引用异常_C#_Asp.net Web Api_Dependency Injection_Autofac - Fatal编程技术网

C# Autofac AutofacControllerConfiguration失败,HttpControllerDescriptorTracer空引用异常

C# Autofac AutofacControllerConfiguration失败,HttpControllerDescriptorTracer空引用异常,c#,asp.net-web-api,dependency-injection,autofac,C#,Asp.net Web Api,Dependency Injection,Autofac,我正在尝试使用Autofac 3.1.0配置我的Web API服务 我已将marker属性添加到控制器: [AutofacControllerConfiguration] public class DocumentController : ApiController { // ... snip ... } 并登记为: // controllers container.RegisterApiControllers(typeof (DocumentController).Assembly)

我正在尝试使用Autofac 3.1.0配置我的Web API服务

我已将marker属性添加到控制器:

[AutofacControllerConfiguration]
public class DocumentController : ApiController
{
    // ... snip ...
}
并登记为:

// controllers
container.RegisterApiControllers(typeof (DocumentController).Assembly);
container.RegisterApiControllers(typeof (WorkflowController).Assembly);

// security
container.RegisterType<OAuthTokenManager>().As<IOAuthTokenManager>();
container.RegisterType<OAuthAccessToken>().As<IOAuthAccessToken>();
container.RegisterType<LegacyTypeAwareIdentifierFactory<IOAuthAccessToken>>().As<ITypeAwareIdentifierFactory<IOAuthAccessToken>>();
container.RegisterType<OAuthTokenExtractor>().As<ITokenExtractor>();
container.RegisterType<OAuthTokenValidator>().As<ITokenValidator>();
container.RegisterType<TokenHelper>().As<ITokenHelper>();

container.Register(x =>
{
    if (x.IsRegistered<HttpRequestMessage>())
    {
        var httpRequestMethod = x.Resolve<HttpRequestMessage>();

        var tokenHelper = x.Resolve<ITokenHelper>();
        var token = tokenHelper.GetToken(httpRequestMethod);

        var connectionContext = x.Resolve<ISqlServerConnectionContext>();
        connectionContext.Token = token;

        return token ?? new NullMinimalSecurityToken();
    }

    return new NullMinimalSecurityToken();
}).As<IMinimalSecurityToken>().InstancePerApiRequest();

container.RegisterType<SecurityTokenAuthorization>()
    .AsWebApiAuthorizationFilterFor<DocumentController>()
    .InstancePerApiRequest();
container.RegisterType<SecurityTokenAuthorization>()
    .AsWebApiAuthorizationFilterFor<WorkflowController>()
    .InstancePerApiRequest();

container.Register(c =>
{
    var connectionString = ConfigurationManager.AppSettings[AppSettingsNames.DatabaseConnection];
    var newConnectionContext = new SqlServerConnectionContext(connectionString) {ProductID = productId};
    newConnectionContext.Open();

    return newConnectionContext;
    }).As<ISqlServerConnectionContext>().As<IConnectionContext>().InstancePerApiRequest().InstancePerApiControllerType(typeof(DocumentController));
如果我只是删除marker属性,我的服务就可以工作,但这不是一个切实可行的解决方案,因为我有两个控制器,需要为每个控制器提供正确的数据库连接。我很乐意实施另一种解决方案,但在为达到这一点奋斗了整整一天之后,我现在还是一片空白


我是否在使用该功能时遗漏了一些东西,或者有人能提出一个替代方案吗?

我将一个应用程序与一个标有该属性的控制器组合在一起;每个请求和每个控制器类型的简单依赖关系;和一个简单的操作。。。我无法重现这个错误。你的应用程序中肯定还有其他一些事情在发生——一些其他服务的变化,一些其他重要的配置正在发生。在Reflector中查看HttpControllerDescriptorTracer.Properties,它只是传递给当前的控制器描述符——我看不到任何东西会引发异常。你能提供更多的细节吗?我肯定我能提供更多的细节。我现在正试图把问题定位。我们有大约100行注册,所以大概有60个组件。显然,将所有这些信息连同它们的来源一起发布是没有帮助的。我还研究了一个问题,即没有为每个请求调用IAutofacAuthorizationFilter。可能相关。不必担心身份验证筛选器。这是一个缺少的builder.RegisterWebApiFilterProviderconfig;您可能需要检查的内容—HttpConfiguration上的服务覆盖列表(如果有)。我看到您扩展了Autofac注册列表,但问题可能只是通过Autofac暴露出来的,而真正的问题在于正在定制的标准Web API服务。例如,如果您有一个自定义IHttpControllerSelector正在使用控制器描述符执行某些操作,这可能会导致问题。除了在执行container.Build之后检查配置之外,还有其他地方可以检查吗?我已经删除了任何看起来可能注册了某个东西的代码—只有一个ApiControllerActionSelector,因此我删除了该注册,因为它所服务的区域与我当前测试的区域不同,但错误没有区别。
{
"Message":"An error has occurred.",
"ExceptionMessage":"Object reference not set to an instance of an object.",
"ExceptionType":"System.NullReferenceException",
"StackTrace":"   at System.Web.Http.Tracing.Tracers.HttpControllerDescriptorTracer.get_Properties()\r\n   at Autofac.Integration.WebApi.AutofacControllerConfigurationAttribute.Initialize(HttpControllerSettings controllerSettings, HttpControllerDescriptor controllerDescriptor)\r\n   at System.Web.Http.Controllers.HttpControllerDescriptor.InvokeAttributesOnControllerType(HttpControllerDescriptor controllerDescriptor, Type type)\r\n   at System.Web.Http.Controllers.HttpControllerDescriptor..ctor(HttpConfiguration configuration, String controllerName, Type controllerType)\r\n   at System.Web.Http.Tracing.Tracers.HttpControllerSelectorTracer.System.Web.Http.Dispatcher.IHttpControllerSelector.SelectController(HttpRequestMessage request)\r\n   at System.Web.Http.Dispatcher.HttpControllerDispatcher.SendAsyncInternal(HttpRequestMessage request, CancellationToken cancellationToken)\r\n   at System.Web.Http.Dispatcher.HttpControllerDispatcher.SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)"
}