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

时间:2015-05-25 09:32:10

标签: c# asp.net asynchronous async-await

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

从哪里恢复它以及如何重写它?

我手动将其设置为虚拟执行页面,如果从application / scheduler中执行,其中context为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

我尝试了各种各样的事情,例如当它为空时设置SynchronizationContext - 甚至强迫上下文使用反射创建内部AspNetSynchronizationContext - 但没有任何帮助。

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

1 个答案:

答案 0 :(得分:0)

  

... SynchronizationContext ...

这应该有所帮助,是可行的方法。事实上,我能想到的唯一方法。它是await中唯一允许您控制延续环境的钩子。没有看到代码,就找不到错误。

如果您无法获得内置的同步上下文,则需要安装自己的内容,其行为与内置的相同。

HttpContext.Current存储在一些“调用上下文”中,这是一个.NET概念。我忘记了反编译代码以查看它存储的确切位置。

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