SynchronizationContext和ASP.NET Web API可扩展性点

tug*_*erk 7 .net c# asynchronous task-parallel-library asp.net-web-api

当我们处理ASP.NET Web API中的一些可扩展性点时,我们还处理TAP(基于任务的编程模式).在某些方面,我们希望提供一个异步方法的延续,ContinueWith并在我们传递给委托的内部做一些事情ContinueWith.

布拉德·威尔逊解释这里深入了的SynchronizationContext是至关重要的,当我们提供延续.对我来说,我需要回到SynchronizationContextASP.NET Web API 的唯一地方是我需要使用的地方HttpContext.Current(这是我在ASP.NET Web API应用程序中永远不会做的事情)和地方我需要为线程设置一些信息,比如Thread.CurrentPrincipal.

所以问题是:我们是否想要回到SynchronizationContext我们在某些可扩展性点(例如消息处理程序,过滤器,格式化程序等)中提供延续的时候?

cas*_*One 2

答案几乎总是肯定的

这并不是说您总是要使用同步上下文,但考虑到消息处理程序、过滤器和格式化程序的性质,您无法预测它们是否需要使用 来SynchronizationContext访问HttpContextBase

即使使用过滤器,您传递的东西可以让您访问HttpContext(例如通过IActionFilter实现),HttpContext最终也会查看CallContext线程上的当前情况以提供来自该实例的信息。由于当前线程(运行异步时)在您启动 时没有该信息Task,因此这些调用将失败。

也就是说,如果您需要HttpContextBase与请求相关的一般、不受限制的访问,那么您绝对必须传递SynchronizationContext才能访问它。

但是,如果可能的话,您应该复制所需的详细信息,并将传递出去;如果你写的东西非常笼统,那么这是不可能的。HttpContextBase