【发布时间】:2020-10-15 04:43:03
【问题描述】:
根据 ASP.Net Core docs,会话状态的行为已经改变,现在它是非锁定的:
会话状态是非锁定的。如果两个请求同时尝试修改会话的内容,则最后一个请求会覆盖第一个请求。 Session 被实现为一个连贯的会话,这意味着所有的内容都存储在一起。当两个请求试图修改不同的会话值时,最后一个请求可能会覆盖第一个请求所做的会话更改。
我的理解是,这与 .Net 框架中会话的行为不同,其中用户的会话被锁定每个请求,因此无论何时读取/写入它,您都不会覆盖另一个请求的数据或为该用户读取过时的数据。
我的问题:
-
有没有办法在 .Net Core 中重新启用用户会话的按请求锁定?
-
如果没有,是否有可靠的方法使用会话来防止给定用户重复提交数据?举一个具体的例子,我们有一个支付流程,涉及用户从外部托管的 ThreeDSecure (3DS) iFrame(支付卡安全流程)返回。我们注意到有时(不知何故)用户在 iFrame 中多次提交表单,我们无法控制。因此,这会触发对我们应用程序的多个回调。在我们之前的 .Net Framework 应用程序中,我们使用会话来指示付款是否正在进行中。如果在会话中设置了此标志并且您再次点击 3DS 回调,则应用程序将阻止您继续进行。然而,现在似乎因为会话没有被锁定,当这些几乎同时发生的重复回调发生时,线程'A'设置'payment in progress = true'但线程'B'没有及时看到,它是快照的会话仍然看到'payment in progress = false'并且回调逻辑被处理了两次。
既然会话的工作方式发生了变化,那么处理访问同一会话的同时请求有哪些好的方法?
【问题讨论】:
-
不要使用会话来存储支付状态等重要的东西,使用持久且易于访问的数据库。会话可能会在多种情况下丢失,这是您在涉及金钱时不想要的东西......此外,使用唯一索引可以避免那些双重交易,我相信您可以为每次付款创建一个唯一密钥(用户 ID + 交易 ID、用户 ID + 产品 ID 或其他),因此您可以使用具有唯一索引的密钥来避免重新发出相同的付款。
-
它允许多次读取和写入...只是最后一次写入是赢家,这意味着...在读取时锁定下一次读取之前...即使它不会改变。基于此......并且只有 1 个线程应该更新值......是什么阻止你阅读它,直到你拥有你想要的值。 aka 需要更多地了解您的流程。至于什么是回调以及为什么......就像它通常如何工作......在改变之前......它只是等待。如果是这样,为什么不让调用循环,直到会话值是您要查找的值.. 不推荐
-
We are noticing that sometimes (somehow) the user is submitting the form within the iFrame multiple times阻止他们这样做? -
这是在 3DS 过程中从 iframe 返回时 - 我们无法访问/控制 iframe 中的表单如何提交。
-
we used the session to indicate if a payment was in progress你仍然可以这样做..检查值..
标签: c# asp.net .net asp.net-core .net-core