如何在Web API 2动作过滤器中实现非阻塞日志记录?

时间:2018-03-29 13:54:29

标签: c# asp.net-web-api async-await asp.net-web-api2

我有ActionFilterAttribute与此相似。

public override async Task OnActionExecutedAsync(HttpActionExecutedContext actionExecutedContext, CancellationToken cancellationToken)
{
    await Task.Delay(3*1000);
}

Task.Delay的位置,假设我有一个异步日志服务调用,它有一些延迟。

我的问题是我还没有找到任何办法让日志记录不阻止请求 - 响应过程。所以这个Task.Delay会阻止刷新的响应。我想避免这种情况,以便在响应时间方面保持良好的用户体验。

这样做的正确方法是什么?

1 个答案:

答案 0 :(得分:0)

使用新任务解雇它以使其保持在单独的线程上。

Task.Run(() => logger.Debug("This is a log entry"));

大多数日志框架已经有了你可以使用的异步方法。如果它们得到正确实施,您将不会添加任何额外的延迟。请记住,这将使用fire记录并忘记(无反馈),并且您将无法控制日志事件的顺序,因为它们不会按顺序写入。

但是,执行此操作的首选方法是编写异步日志追加程序,而不是在开发人员可能容易遗漏的某些OWIN中间件中执行此操作。