它确保您的继续将获得与原始呼叫者相同的HttpContext.Current?
它不保证延续将在与呼叫者相同的线程上执行?
如果后一种假设不是真的,并且我得到原始的线程,我可以确保在延续中获得相同的线程上下文吗?我的意思是与线程和线程本地存储相关联的主体/文化?这很重要,因为ASP.NET本地化依赖于线程的文化,我的应用程序依赖于.NET角色安全模型(线程的主体)。
解决方法
Am I correct that It does guarantee your continuations will get the same HttpContext.Current as original callers? It does not guarantee the continuations will execute on the same thread as the callers?
是的,HttpContext.Current被保留,是的,继续可能在不同的线程上执行。
I mean principal/culture associated with the thread and thread local storage? That’s important because ASP.NET localization relies on thread’s culture and my application relies on .NET role security model (thread’s principal).
普通线程本地存储丢失。您可以通过使用LogicalCallContext(与ExecutionContext一起流动)来缓解这一点,但是通过异步,只需直接引用变量就更容易了。
校长始终保留;否则将是一个安全风险。这与ExecutionContext一起流动。
我相信文化流动与AspNetSynchronizationContext,但我没有测试这个在.NET 4.5’s new implementation。
你可能会发现我的MSDN article on SynchronizationContext
有帮助。这不是官方文档(我不适用于微软),但至少是这样的。请注意,该文章中引用的AspNetSynchronizationContext现在在.NET 4.5中称为LegacyAspNetSynchronizationContext。
另一个伟大的资源是Stephen Toub的ExecutionContext
vs. SynchronizationContext
。