繁体   English   中英

ASP Net Core 3 Session(状态)并发和完整性

[英]ASP Net Core 3 Session (state) concurrency and integrity

我有一个页面同时请求多个请求。 所以这些请求在同一个 session 中。 为了访问 session 我到处使用IHttpContextAccessor

我的问题是,无论时间如何,一些请求都没有看到其他请求已经设置 session state,而是看到一些以前的 state。 (再次在时间上,设置 state 操作已经发生,仍然)

据我所知,每个请求都有自己的 state 副本,它被写回......(以及“何时”?)到常见的“一个”state。 如果这个“时间”是延迟到请求完全服务的时间,那么我遇到的情况很容易发生:session 中的第二个并发请求在第一个请求修改 state 之后得到了他的副本,但在它完全完成之前。

然而,这一切意味着如果在 session 中提供并发请求,则无法保持 session 的完整性。 第二个没有看到第一个已经完成的更改,将写回与已经完成的第一个过程更改不一致的内容。

我错过了什么吗? 有什么解决方法吗? (当然有一些费用)

首先,您可能已经知道这一点,但需要指出的是,以防万一: session state 特定于一个客户端。 那么,您在这里所说的是同一个客户端同时抛出多个并发请求,每个请求都触及同一块 session state。 总的来说,这似乎是一个糟糕的设计。 如果有一些实际的应用程序原因需要来自同一个客户端的多个并发请求,那么这些请求所做的应该是幂等的,或者至少不会相互影响。 如果客户端只是因为不耐烦或恶意而向服务器发送垃圾邮件,那么您的 session state 是否因此而损坏真的不是您关心的问题。

其次,由于上述原因,并发性并不是会话真正关心的问题。 我无法想象客户端需要同时发送多个请求,每个请求都修改相同的 session 密钥的用例。 如果有,请通过相应地编辑您的问题来说明。 但是,我仍然认为这可能是您首先不应该坚持在 session 中的东西。

也就是说,session 是线程安全的,因为多个同时写入/读取不会导致异常,但不能或不能保证完整性。 这在所有并发场景中都是通用的。 作为开发人员,您有责任确保数据完整性,如果这是一个问题。 您可以通过设计并发策略来做到这一点。 这可能是从锁/信号量到门访问的任何东西,或者只是补偿带外发生的事情。 例如,使用 EF,您可以在数据库表中使用并发令牌来防止一个请求覆盖另一个请求。 每次成功更新都会修改令牌的值,并且在进行更新之前会根据当前数据库值检查应用程序已知的值,以确保自应用程序启动更新以来它没有被修改。 如果有,则抛出异常,让应用程序有机会通过取消更新、获取新数据并对其进行修改或只是推动覆盖来捕获和恢复。 这是为了说明如果 session 数据的完整性很重要,您将需要提出某种类似的策略。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM