【问题标题】:.net core HttpContext null inside async Task.Run.net core HttpContext null 在异步 Task.Run 中
【发布时间】:2021-08-10 05:29:19
【问题描述】:

我正在使用 .net core 3.1 api 项目,我想在我的 Task.Run 块中访问 HttpContext。这是我的代码:

          // before Task.Run my HttpContextAccessor.HttpContext has correct values      
Task.Run(async () =>
               {               
                   //any other method with await here
                    var data = await SomeMethod(config); // in that method HttpContextAccessor.HttpContext is null

                }, cancellationToken)

在 asp.net 中我可以使用 friendlysynchronizationcontext 来处理它,但在 .net core 中没有同步上下文。

谁能给我一个解决方案/解释如何解决这个问题?

【问题讨论】:

  • 嗨@Wojna,你能分享一下你调用HttpContextAccessor的方法吗?您如何将 HttpContextAccessor 服务注册到该方法中?
  • @Rena 我正在使用 autofac,所以我在我的服务构造函数中使用 IHttpContextAccessor contextAccessor。并在启动时注册 builder.RegisterType().As().SingleInstance();
  • API 在 Task 可以使用响应之前发送响应,最好从请求中提取数据,然后在单独的方法中使用它。我也被类似的场景咬过

标签: asp.net-core asynchronous async-await httpcontext


【解决方案1】:

来自documentation

HttpContext 不是线程安全的。在处理请求之外读取或写入 HttpContext 的属性可能会导致 NullReferenceException。

捕获HttpContext 或使用IHttpContextAccessor 访问它可能会给您带来麻烦。

最佳做法是从请求中收集所需的任何信息,对其进行处理并使用处理结果来生成响应。

此外,请求在线程池线程上处理,Task.Run shedules 工作在线程池线程上运行。这会导致使用额外的线程、额外的上下文切换和额外的线程池工作,但对应用程序没有真正的好处(恰恰相反)。

【讨论】:

    猜你喜欢
    • 2022-11-15
    • 1970-01-01
    • 2023-03-24
    • 2021-05-05
    • 2021-09-26
    • 1970-01-01
    • 1970-01-01
    • 2018-05-28
    • 1970-01-01
    相关资源
    最近更新 更多