c# - 为什么在控制器操作中等待异步方法后 System.Web.HttpContext.Current 为空?
问题描述
在我的 ASP.NET MVC Web 应用程序中,我的一个Controller
操作方法调用了一些依赖于从当前HttpContext
. 该代码不是 my 的一部分Controller
,因此不能使用Controller.HttpContext
- 而是使用System.Web.HttpContext.Current
. (我知道这是一个坏主意,但我无法改变它)。
await
在我向我的Controller
操作方法添加一个之前,这一切都有效。现在,当我随后调用使用System.Web.HttpContext.Current
它的代码时失败,因为HttpContext.Current
is null
.
我做了一些阅读,发现一些System.Web.HttpContext.Current
内容只设置在处理 Web 请求的线程上。那讲得通。但是,令我惊讶的是,简单地使用await
就足以切换到不同的线程。
我的理解是,使用without await
(ConfigureAwait(false)
如 in var result = await myTask;
)可确保在.await
SynchronizationContext
await
我在心里将此等同于“在同一个线程上运行”——也就是说,之后的代码await
将与之前的代码在同一个线程上运行await
(即使Task
等待的代码可能在不同的线程上执行)。事实证明这不是真的 -Thread.CurrentThread.ManagedThreadId
之前和之后是不同的await
。
奇怪的是,我看到的行为与这个问题中描述的相反。
我很困惑 - 任何人都可以了解(a)我是否应该System.Web.HttpContext.Current
在任何await
调用后为空,以及(b)是否有任何方法可以await
在同一线程上恢复后的代码以使其不为空?
解决方案
好的,我在类似的问题上找到了这个答案。显然,这种行为是由 ASP.NET 的“怪癖模式”引起的。:-(
web.config
通过确保await
在同一线程上执行之后的代码,将以下内容添加到我的解决问题中,因此HttpContext.Current
是非空的。
<add key="aspnet:UseTaskFriendlySynchronizationContext" value="true"/>
推荐阅读
- node.js - TypeError:passport.authenticate 不是函数
- sql - 计算其成员资格即将到期的所有用户的存储过程
- slurm - SLRUM:如何限制 CPU 作业数以避免浪费 GPU 资源
- websphere - 从 z/OS 到 Kafka 使用哪个 IBM CDC Engine
- javascript - 我遇到的错误是:无法读取未定义的属性“forEach”
- android - 无法在清单中同时设置值为 1337 的即时应用元数据标记和应用链接
- autodesk-forge - Inventor 的设计自动化。导出到 SVF
- javascript - 通过 map() 函数向对象添加新的键/值 - 异步承诺返回待处理的承诺而不是值
- javascript - 大家好,我是nodejs和mongoose的新手。我猜路由似乎有问题。当我单击删除工作网址时,它会自动调用 addwork
- flutter - 为什么我在 Flutter 中收到 HTTPS 错误 BAD_REQUEST