Ste*_*eve 8 c# asynchronous asp.net-core
根据我读过的内容asp.net core已经删除了同步上下文。这意味着在await调用之后执行代码的线程可能与之前执行代码的线程不同await
那么HttpContext在async方法中使用仍然安全吗?或者是否有可能在await通话后获得不同的上下文?
例如在控制器动作中
public async Task<IActionResult> Index()
{
var context1 = HttpContext;
await Task.Delay(1000);
var context2 = HttpContext;
....
}
Run Code Online (Sandbox Code Playgroud)
context1 可以与 context2 不同吗?
在无控制器方法中获取上下文的推荐方法是依赖注入 IHttpContextAccessor
是IHttpContextAccessor.HttpContext从安全async await模式?
IE 可以将 context1 与 context2 不同吗?
public async void Foo(IHttpContextAccessor accessor)
{
var context1 = accessor.HttpContext;
await Task.Delay(1000);
var context2 = accessor.HttpContext;
}
Run Code Online (Sandbox Code Playgroud)
Ste*_*ary 10
那么在异步方法中使用 HttpContext 仍然安全吗?或者是否有可能在等待调用后获得不同的上下文?
async和HttpContext和 ASP.NET pre-Core的整个问题是由于代码通常HttpContext从HttpContext.Current. ASP.NET 是一个多线程服务器,每个服务器都await可以在不同的线程上恢复。因此 ASP.NET pre-Core 必须在异步代码恢复之前具有AspNetSynchronizationContext该托管设置HttpContext.Current。
现代 ASP.NET Core没有同步上下文。但这很好,因为它也没有HttpContext.Current. 获取HttpContext实例的唯一方法是通过本地属性(例如,HttpContext在您的控制器类上)或依赖项注入 ( IHttpContextAccessor)。
(迂腐注意:上面的解释有点简化 - ASP.NET pre-Core 同步上下文确实处理了其他事情HttpContext.Current- 但相同的整体解释适用于它的所有其他职责 - 即,它们在 Core 世界中不是必需的)
因此,上下文不可能不同。它们是相同的属性——相同的对象实例。ASP.NET pre-Core 的问题是静态属性 value HttpContext.Current,它已在 ASP.NET Core 中删除。
| 归档时间: |
|
| 查看次数: |
1468 次 |
| 最近记录: |