7

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

正如 Brad Wilson在这里深入解释的那样,当我们提供延续时,SynchronizationContext 至关重要。对我来说,我需要回到SynchronizationContextASP.NET Web API 的唯一地方是我需要玩的地方HttpContext.Current(这是我在 ASP.NET Web API 应用程序中永远不会做的事情)和地方我需要为基于线程的信息设置一些信息,例如Thread.CurrentPrincipal.

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

4

1 回答 1

2

答案几乎总是肯定的。

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

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

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

但是,如果可能的话,您应该从您需要的内容中复制详细信息,然后将其传递出去;如果你正在写一些非常笼统的东西,那么这是不可能的。HttpContextBase

于 2012-10-22T21:04:51.953 回答