Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net core ASP Net核心3会话(状态)并发性和完整性_Asp.net Core_Session State - Fatal编程技术网

Asp.net core ASP Net核心3会话(状态)并发性和完整性

Asp.net core ASP Net核心3会话(状态)并发性和完整性,asp.net-core,session-state,Asp.net Core,Session State,我有一个同时请求多个请求的页面。所以这些请求都在同一个会话中。为了访问会话,我使用everywhereIHttpContextAccessor 我的问题是,无论何时,一些请求都不会看到其他已设置会话状态的请求,而是看到以前的一些状态。(同样在计时中,设置状态操作已经发生,仍然) 据我所知,每个请求都有自己的状态副本,它会被写回。。。(以及“何时”?)到共同的“一”状态。如果这个“when”是延迟到何时请求被完全服务,那么我所经历的场景很容易发生:会话中的第二个并发请求在第一个请求修改状态之后但在

我有一个同时请求多个请求的页面。所以这些请求都在同一个会话中。为了访问会话,我使用everywhere
IHttpContextAccessor

我的问题是,无论何时,一些请求都不会看到其他已设置会话状态的请求,而是看到以前的一些状态。(同样在计时中,设置状态操作已经发生,仍然)

据我所知,每个请求都有自己的状态副本,它会被写回。。。(以及“何时”?)到共同的“一”状态。如果这个“when”是延迟到何时请求被完全服务,那么我所经历的场景很容易发生:会话中的第二个并发请求在第一个请求修改状态之后但在完全完成之前获得了副本

然而,这一切都意味着,在会话中提供并发请求服务的情况下,无法保持会话完整性。第二个在第一个之前没有看到已经完成的更改,将写回与已经完成的第一个流程更改不一致的内容

我错过什么了吗?
有什么解决办法吗?(当然要付出一些代价)

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

其次,由于上面概述的原因,并发性并不是会话真正关心的问题。我想象不出客户端需要同时发送多个请求,每个请求都修改相同的会话密钥。如果有,请通过相应编辑您的问题进行说明。然而,我仍然认为这可能是你不应该在会议中坚持的事情


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

为什么您需要一个请求能够“看到”另一个请求?您是否托管应用程序的一个实例?不需要相互查看。但是,所有请求都会在公共状态中进行更改,并且必须保持一致。请求不会在web服务器中序列化(谢天谢地),因此这些更改会同时发生,不依赖真实的当前状态将导致状态不一致。。。就我所见,会话状态的整个实现概念都是假设会话中的请求是序列化的,这在异步服务器体系结构中毫无意义。如何在会话中存储共享状态?