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

时间:2015-04-01 20:47:14

标签: c# asp.net-mvc session thread-safety owin

我想要一个可以访问整个请求的单例,并且只能从该请求中调用。

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

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

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

第二次,我是否会遇到使用TPL或其他异步编程方法的问题,因为单个实例应该是可用的,因为它是相同的请求,但它不是因为它可能正在执行一个不同的线程。

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

1 个答案:

答案 0 :(得分:2)

我正在寻找

HttpContext.Current.Items。这种情况似乎存在一个简单的每请求集合。