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);
}
}
}