gpt4 book ai didi

c# - Asp.net Core 中的 HttpContext 异步安全吗?

转载 作者:行者123 更新时间:2023-11-30 16:37:31 27 4
gpt4 key购买 nike

根据我阅读的内容,asp.net core 已经删除了同步上下文。这意味着在 await 调用之后执行代码的线程可能与在 await

之前执行代码的线程不同

那么 HttpContext 仍然可以安全地用于 async 方法吗?或者在 await 调用之后是否有可能获得不同的上下文?

例如在 Controller Action 中

public async Task<IActionResult> Index()
{
var context1 = HttpContext;
await Task.Delay(1000);
var context2 = HttpContext;
....
}

context1 可以不同于 context2 吗?

在无 Controller 方法中获取上下文的推荐方法是通过依赖注入(inject) IHttpContextAccessor

对于 async await 模式,IHttpContextAccessor.HttpContext 是否安全?

即context1 可以不同于 context2 吗?

public async void Foo(IHttpContextAccessor accessor)
{
var context1 = accessor.HttpContext;
await Task.Delay(1000);
var context2 = accessor.HttpContext;
}

最佳答案

So is HttpContext still safe to use in async methods? or is it possible to get a different context after the await call?

asyncHttpContext 以及 ASP.NET pre-Core 的整个问题是由于代码通常从以下位置获取其 HttpContext HttpContext.Current。 ASP.NET 是一个多线程服务器,每个 await 都可以在不同的线程上恢复。因此 ASP.NET pre-Core 必须有一个 AspNetSynchronizationContext 来在异步代码恢复之前管理设置 HttpContext.Current

现代 ASP.NET Core 没有同步上下文。但这没关系,因为它没有HttpContext.Current。获取 HttpContext 实例的唯一方法是通过本地属性(例如, Controller 类上的 HttpContext)或依赖项注入(inject)(IHttpContextAccessor)。

(迂腐的注解:上面的解释有点简化 - ASP.NET pre-Core 同步上下文确实处理了除 HttpContext.Current 之外的其他事情 - 但相同的整体解释适用于它的所有内容其他职责——也就是说,它们在核心世界中不是必需的)

因此,上下文不可能不同。它们是相同的属性——相同的对象实例。 ASP.NET pre-Core 的问题是 static 属性值 HttpContext.Current,已在 ASP.NET Core 中删除。

关于c# - Asp.net Core 中的 HttpContext 异步安全吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57861682/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com