Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/339.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# 全局应用时未调用WebApi操作筛选器依赖项注入_C#_Asp.net Web Api_Dependency Injection_Unity Container - Fatal编程技术网

C# 全局应用时未调用WebApi操作筛选器依赖项注入

C# 全局应用时未调用WebApi操作筛选器依赖项注入,c#,asp.net-web-api,dependency-injection,unity-container,C#,Asp.net Web Api,Dependency Injection,Unity Container,我有一个简单的WebApi操作(异常)过滤器 public class LogExceptionAttribute : ExceptionFilterAttribute { [Dependency] public ILogger Logger { get; set; } public override void OnException(HttpActionExecutedContext context) { Logger.Fatal(contex

我有一个简单的WebApi操作(异常)过滤器

public class LogExceptionAttribute : ExceptionFilterAttribute
{
    [Dependency]
    public ILogger Logger { get; set; }

    public override void OnException(HttpActionExecutedContext context)
    {
        Logger.Fatal(context.Exception, "Critical exception in request to WebApi controller.");

        throw new HttpResponseException(new HttpResponseMessage(HttpStatusCode.InternalServerError)
        {
            Content = new StringContent("Internal Server Error."),
            ReasonPhrase = "Critical Exception"
        });

    }
}
统一筛选器提供程序

public class UnityFilterProvider : IFilterProvider
{
    private IUnityContainer _container;
    private readonly ActionDescriptorFilterProvider _defaultProvider = new ActionDescriptorFilterProvider();

    public UnityFilterProvider(IUnityContainer container)
    {
        _container = container;
    }

    public IEnumerable<FilterInfo> GetFilters(HttpConfiguration configuration, HttpActionDescriptor actionDescriptor)
    {
        var attributes = _defaultProvider.GetFilters(configuration, actionDescriptor);

        foreach (var attr in attributes)
        {
            _container.BuildUp(attr.Instance.GetType(), attr.Instance);
        }
        return attributes;
    }
}
依赖关系未被解析,我在尝试从筛选器中访问ILogger实例时遇到空引用异常

我错过了什么?

试试看

    config.Filters.Add((IExceptionFilter)GlobalConfiguration.Configuration.DependencyResolver.GetService(typeof(LogExceptionAttribute)));
附加

在你的评论之后,我进一步检查了我的评论

我有构造函数依赖关系

public class LogExceptionAttribute : ExceptionFilterAttribute, IExceptionFilter
{
    private ILogger Logger { get; set; }

    public LogExceptionAttribute  (ILogger logger)
    {
        this.Logger  = logger;
    }

    public override void OnException(HttpActionExecutedContext context)
    {
        if (context.Exception != null)
        {
            this.Logger.LogException(context.Exception);
        }
    }
}

因此,我的建议是切换到构造函数注入。

System.Web.Http.dll中发生了类型为“System.ArgumentNullException”的异常,但未在用户代码中处理。我认为不可能将构造函数注入与actionfilterattribute一起使用?我为“LogExceptionAttribute”发布的代码(类名称除外)这正是我所拥有的……。可能也是为什么我的原始代码snipplet的语法略有不同。@JamesLaw-可以使用构造函数注入,但必须将
IActionFilter
属性
分开,并全局注册
IActionFilter
,如中所示。
    config.Filters.Add((IExceptionFilter)GlobalConfiguration.Configuration.DependencyResolver.GetService(typeof(LogExceptionAttribute)));
public class LogExceptionAttribute : ExceptionFilterAttribute, IExceptionFilter
{
    private ILogger Logger { get; set; }

    public LogExceptionAttribute  (ILogger logger)
    {
        this.Logger  = logger;
    }

    public override void OnException(HttpActionExecutedContext context)
    {
        if (context.Exception != null)
        {
            this.Logger.LogException(context.Exception);
        }
    }
}