首页 新闻 搜索 专区 学院

.net framework 4.6 MVC 中 CallContext 会窜请求?

0
悬赏园豆:200 [已解决问题] 解决于 2018-04-04 09:58

我有一个MVC程序, 宿主在windows server2008R2 的iis 7.5上 , 登录用户信息是从Cookie里读取缓存, 然后保存在 CallContext中, 后续的操作获取用户都是取CallContext, 但我发现A用户请求, 获取的登录用户信息是 B用户的,  这个概率很低,  但是一旦出错, 是很难容忍的. 请问dudu 和各位牛人 , 微软的这个CallContext是否有这个问题 , 如何解决? 感谢..

Gavin Luo的主页 Gavin Luo | 初学一级 | 园豆:2
提问于:2018-04-03 18:57
< >
分享
最佳答案
0

本来就不应该也不能这样保存在 CallContext 中,ASP.NET 的同一个线程本来就会被多个请求使用,请用 Session

收获园豆:180
dudu | 高人七级 |园豆:39034 | 2018-04-03 19:21

我使用了负载均衡, 没有使用Session, 请问我能否使用HttpContext.Current.Item 来代替 . 另外 WCF 中这个 CallContext 是否安全?

Gavin Luo | 园豆:2 (初学一级) | 2018-04-03 19:37

@Gavin Luo: 负载均衡可以开启会话支持,不用 Session 可以用保存在 Memcached 或 Redis 中。WCF 也不安全。

dudu | 园豆:39034 (高人七级) | 2018-04-03 20:42

@dudu: 登录信息我是保存在了Redis中, 为了避免同一个请求频繁读取 Redis 拿用户信息,也没有传递 token到后续的各个子方法中 , 所以想用 HttpContext.Current.Item 做一个请求级别的临时存储, 是否可行?

Gavin Luo | 园豆:2 (初学一级) | 2018-04-03 20:46

@Gavin Luo: HttpContext.Current.Items 可以,这个只对当前请求有效

dudu | 园豆:39034 (高人七级) | 2018-04-03 20:48

@dudu: 感谢你, 如果我是想在 Task的线程中 做这种临时存储, 是否可以用 CallContext.

Gavin Luo | 园豆:2 (初学一级) | 2018-04-03 20:50

@Gavin Luo: 更不能使用,一次 await 就是一次线程切换

dudu | 园豆:39034 (高人七级) | 2018-04-03 20:57

@dudu: 受教了, 如果我没有用await, 只是用Task起线程 Run 或者 Start 这种单纯的多线程操作,最后偶尔用用 Task.WaitAll(), 这种能否可以使用 ?

Gavin Luo | 园豆:2 (初学一级) | 2018-04-03 21:03

@Gavin Luo: 不可以使用。建议通过传参或 HttpContext.Current.Items 的方式,只要不使用 .ConfigureAwait(false) ,Task 中也可以访问 HttpContext.Current.Items

dudu | 园豆:39034 (高人七级) | 2018-04-03 21:18

@Gavin Luo: 如果使用 ASP.NET Core ,这个问题可以轻松搞定,定义一个用于保存登录用户信息的类,用 services.AddScoped 依赖注入

dudu | 园豆:39034 (高人七级) | 2018-04-03 21:38
其他回答(2)
0

dudu说的对,本来就不应该保存在CallContext中。我来蹭点豆子。

收获园豆:10
Shendu.CC | 园豆:1914 (小虾三级) | 2018-04-03 19:35
0

一楼正解,话说我也是来蹭豆子的!

收获园豆:10
对象不是老婆 | 园豆:316 (菜鸟二级) | 2018-04-04 09:29
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册