gpt4 book ai didi

c# - await 将 HttpContext.Current 设置为 null/prior - 无法手动设置

转载 作者:太空宇宙 更新时间:2023-11-03 15:40:31 24 4
gpt4 key购买 nike

如何使用手动设置的 HttpContext.Current/CallContext.HostContext 使等待恢复?当它返回到原始状态时,所有等待都会更改它(不恢复它/将它恢复为其他值)。

它从哪里恢复它以及如何覆盖它?

我手动将其设置为虚拟执行页面,如果从上下文为 null 的应用程序/调度程序完成,它将返回 null(如果从另一个页面,它返回到那个)。

var wr = new System.Web.Hosting.SimpleWorkerRequest(...);
var context = new HttpContext(wr);
HttpContext.Current = context;
...
await Task.Delay(100);
// HttpContext.Current has now returned to old value / null

我已经尝试过各种方法,比如在它为 null 时设置 SynchronizationContext - 甚至强制上下文使用反射创建内部 AspNetSynchronizationContext - 但没有任何帮助。

(答案不是不使用 HttpContext.Current 也不是不使用 .Wait() 等的空同步上下文)

最佳答案

... SynchronizationContext ...

这应该有所帮助并且是要走的路。事实上,我能想到的唯一方法。它是 await 中唯一允许您控制延续环境的 Hook 。不看代码就找不到错误。

如果您无法使用内置的同步上下文进行协作,您需要安装自己的同步上下文,它的行为与内置的同步上下文足够相似。

HttpContext.Current 存储在一些“调用上下文”中,这是一个 .NET 概念。反编译代码看看具体存放在哪里,忘记了。

您可能应该使用完全不同的方法。调用内部 URL 来执行您的页面,所有这些问题都会消失。无需再做 hack 了。如果这是一个高频操作,请考虑为每个虚假 HTTP 请求运行多个页面。这减少了开销。

关于c# - await 将 HttpContext.Current 设置为 null/prior - 无法手动设置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30435179/

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