如何在单个 HTTP 请求的所有调用中安全地访问单例静态值

How to make singleton static value securely accessible across all calls for a single HTTP request

我想要一个可访问整个请求且仅可访问来自该请求的调用的单例。

我有一个客户要求不使用内置的服务器端会话。 相反,我每次都需要根据请求的 cookie 和查询字符串重建 UserSession 对象,并使用数据库对其进行验证。 构建 UserSession 对象会产生一些开销,因此我希望每个请求尽可能早地只执行一次,然后在整个请求中稍后引用该对象。

目前我正在使用 OWIN 中间件来调用实际构建它的外观对象,然后我将结果粘贴到用 [ThreadStatic] 装饰的 class 静态字段中。然后,我在我的控制器上使用自定义授权属性来检查该单例以确保它有效。

首先,这在多个请求中是否安全?换句话说,使用 [ThreadStatic] 是否确保每个请求静态对象永远不会被另一个 HTTP 请求访问,即使是来自同一浏览器会话。

其次,我可以 运行 解决使用 TPL 或其他异步编程方法的问题,在这些方法中单例实例应该可用,因为它是相同的请求,但是这不是因为它可能在不同的线程上执行。

最后,我做错了吗?对于这个问题,有没有比我现在做的更好或更成熟的解决方案。

HttpContext.Current.Items 是我要找的。一个简单的按请求集合似乎存在于此类场景中。