【发布时间】:2016-05-03 16:01:15
【问题描述】:
我创建了一个从System.Web.Http.Filters.ActionFilterAttribute 继承的LoggedAttribute 类,并将登录放入OnActionExecuting 和OnActionExecutingAsync 方法;我曾假设一个用于异步调用,一个用于非异步调用,但似乎两者都在使用。那么我应该登录哪个呢?
更新
代码如下:
public sealed class LoggedAttribute : ActionFilterAttribute
{
private readonly ILog _logger;
public LoggedAttribute(ILogManager logManager)
{
_logger = logManager.GetLogger<LoggedAttribute>();
}
public LoggedAttribute() : this(new LogManager()) {}
public override void OnActionExecuting(HttpActionContext actionContext)
{
//logging logic goes here
base.OnActionExecuting(actionContext);
}
public override async Task OnActionExecutingAsync(HttpActionContext actionContext, CancellationToken cancellationToken)
{
//logging logic goes here
await base.OnActionExecutingAsync(actionContext, cancellationToken);
}
}
然后,我将 [Logged] 属性应用到我的基本 ApiController,我得到了单个调用的重复日志条目。
【问题讨论】:
-
您是否将过滤器应用于同步和异步操作,请提供代码
-
如果异步操作被取消,是否要记录?调用树是 OAEAsync->OAE...
-
我真的不在乎它是否被取消;我只想记录请求和相关的元数据。
-
@bri,如果我理解正确的话,我只需要将逻辑放入
OnActionExecuting即可记录请求。 -
这就是我所在的位置。在调用堆栈上暂停之前,我看了一个小时左右——但我没有深入研究源代码或任何东西;-)。
标签: c# asp.net-web-api async-await