使用TempData时,我的理解是,它将仅对一个请求保留您放入的内容。因此,当使用TempData在重定向中保留数据时(为了使用Post-Request-Get模式),在发送重定向的响应和请求之间,来自用户的其他请求是否有可能进入服务器。用户的浏览器请求重定向到页面?在这种情况下,获取将不再具有可用的TempData,对吗?
现在,我了解到这种情况很少发生,但是考虑到用户可能在另一个选项卡中打开了另一个页面,并且该页面上可能发生了ajax或定时回调请求,因此突然没有对我来说似乎是不可能的。只是一般认为它太遥远而不必担心,还是我误会了某些东西?
编辑:要更具体地说明我所询问的情况。
在选项卡1中,用户浏览到页面
带有邮寄表格
在选项卡2中,用户浏览到站点上另一个执行该操作的页面
计时器上的Ajax回调
在选项卡1中,用户将表单发布到服务器
服务器收到帖子后,会将一些数据保存在TempData中
并发回重定向响应
在选项卡2中,发生了定时的ajax回调,将GET请求发送到服务器。 TempData已从会话中删除
在选项卡1中,浏览器接收重定向并发出GET请求
服务器处理GET请求并查找TempData,但现在不存在了
最佳答案
好了,浏览ASP.NET MVC代码显示,虽然TempData存储在会话中,但在加载时将其从会话中删除。然后将其加载到Controller的ExecuteCore()方法中。
因此,我认为这意味着可以,您完全可能陷入竞争状态,其中来自其他浏览器选项卡的请求(您有一个很好的示例)可能导致此问题。但这取决于每个浏览器的模型来处理请求。浏览器可能会将所有请求序列化到同一服务器,以便一次只执行一个。实际上,他们不会这样做,但是会将其限制为最多(我认为)对同一服务器的5个并发请求。
鉴于ASP.NET MVC站点可以是对任何浏览器(毕竟是Web :)的服务请求,这是一个真实的场景,尽管这很罕见,正如您所说。
关于asp.net - 在跨重定向使用Asp.Net MVC TempData时是否存在“竞赛条件”?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/235665/