如何登录后台任务并避免异步状态损坏

时间:2018-11-22 19:32:32

标签: nlog

将Nlog.Web.AspNetCore 4.7.0与Microsoft.AspNetCore.App 2.1.1一起使用

我有一些后台任务,例如发送电子邮件,并且基本上我不等待结果完成。我使用NLog记录来记录这些任务的结果。

在后台任务中完成日志输入后,下一个请求将丢失其HTTP方法,然后返回404,因为没有路由就没有HTTP方法来响应请求。

根据Microsoft,在后台线程中访问HttpContext是不安全的,并且可能导致异步状态损坏,从而导致此问题。 参见https://github.com/aspnet/AspNetCore/issues/4195

所以我的问题是,在后台任务中有使用Nlog的安全方法吗?我可以改变一些东西吗?

2 个答案:

答案 0 :(得分:0)

NLog非常关注异步日志记录。标准的NLog布局执行对当前上下文状态的捕获,以允许异步日志记录。

默认情况下,所有NLog布局渲染器都将在注册logevent时执行当前上下文状态的捕获。

只有不依赖于当前上下文状态的“优化”版图渲染器才能跳过此捕获的开销。

您不必启用自己的后台任务,而应启用<targets async="true">并在HttpContext处于活动状态时执行日志记录。

NLog邮件目标(或Mailkit目标)应立即可用,以捕获所需的HttpContext状态,以便它们可以在后台发送邮件。如果不是,那么应该向NLog项目报告该错误:https://github.com/NLog/NLog/issues/new/choose

答案 1 :(得分:0)

解决方案是不直接引用HttpContext。通过HttpContextAccessor实例访问它:

protected IHttpContextAccessor _contextAccessor = new HttpContextAccessor();

// _contextAccessor.HttpContext?.XYProperty