Asp.net mvc 4 Castle Windsor在使用ASP.NET MVC过滤器时未提供NLog组件

Asp.net mvc 4 Castle Windsor在使用ASP.NET MVC过滤器时未提供NLog组件,asp.net-mvc-4,castle-windsor,nlog,Asp.net Mvc 4,Castle Windsor,Nlog,注册 container.AddFacility<LoggingFacility>(f => f.LogUsing(LoggerImplementation.NLog) .WithConfig("NLog.config")); 但是,如果我这样更改代码: [CustomHandleError] public class EmailController : Cont

注册

container.AddFacility<LoggingFacility>(f => f.LogUsing(LoggerImplementation.NLog)
                                                         .WithConfig("NLog.config"));
但是,如果我这样更改代码:

[CustomHandleError]
public class EmailController : Controller
{
    [CustomHandleError]
    public ActionResult Send(UserMessageModel userMessage, bool captchaValid, string captchaErrorMessage)
    {


        if (ModelState.IsValid)
        {
            // Do something
        }
        ...
    }
    ...
}
public class CustomHandleError: HandleErrorAttribute
{
    private ILogger _logger = NullLogger.Instance;

    public ILogger Logger
    {
        get { return _logger; }
        set { _logger = value; }
    }

    public override void OnException(ExceptionContext filterContext)
    {
        if (filterContext == null)
        {
            base.OnException(null);
        }

        _logger.Error(string.Format("Error msg:{0}\rError stacktrace:{1}", filterContext.Exception.Message, filterContext.Exception.StackTrace));

        if (filterContext.HttpContext.IsCustomErrorEnabled)
        {
            filterContext.ExceptionHandled = true;
            base.OnException(filterContext);
        }
    }
}
在本例中_记录器是“NullLogger.Instance”。我认为我有一个“Logger”属性这一事实意味着Castle Windsor会将Logger更改为NLog,类似于前面的代码

我会有什么误解

编辑 我现在已经添加了代码,如果有人能看一下,那就太好了

仅供参考:共有4次提交。 第一次提交是初始提交 第二次提交表明我可以按要求让NLog工作 第三次提交证明我可以使数据属性正常工作,即我成功地在Castle Windsor中注册了过滤器
最后一次提交是我上面描述的问题,即我无法使集中日志记录使用NLog。

过滤器不是通过容器自动创建的。您需要在控制器工厂中使用IActionInvoker

读这篇文章

编辑

您的自定义筛选器需要从ActionFilterAttribute而不是HandleErrorAttribute派生,以便容器注入依赖项(利用示例中实现的IActionInvoker)。
如果筛选器的目的是处理错误,则还将实现IEExceptionFilter。

我已添加了给定的代码,但记录器仍设置为NullLogger。我注意到一件奇怪的事情,“WindStorActionInvoker”的“ActionExecutedContext”从未执行过。为什么在类级别和方法级别都添加了错误处理程序属性?我猜actioninvoker只能在类级别工作,我已经尝试在类和方法级别同时放置错误处理程序属性,但它没有工作。我必须在Github上编写一些代码,这可能会更有帮助。您是否仅在我的IActionInvoker示例中尝试在类级别使用该属性?是的,我尝试仅在类级别、方法级别和两个级别使用该属性。我很确定这是我在做的蠢事,尽管我现在还不能确定。
[CustomHandleError]
public class EmailController : Controller
{
    [CustomHandleError]
    public ActionResult Send(UserMessageModel userMessage, bool captchaValid, string captchaErrorMessage)
    {


        if (ModelState.IsValid)
        {
            // Do something
        }
        ...
    }
    ...
}
public class CustomHandleError: HandleErrorAttribute
{
    private ILogger _logger = NullLogger.Instance;

    public ILogger Logger
    {
        get { return _logger; }
        set { _logger = value; }
    }

    public override void OnException(ExceptionContext filterContext)
    {
        if (filterContext == null)
        {
            base.OnException(null);
        }

        _logger.Error(string.Format("Error msg:{0}\rError stacktrace:{1}", filterContext.Exception.Message, filterContext.Exception.StackTrace));

        if (filterContext.HttpContext.IsCustomErrorEnabled)
        {
            filterContext.ExceptionHandled = true;
            base.OnException(filterContext);
        }
    }
}