当使用TempData时,我的理解是它会保留你所放置的任何内容,只需要一个请求.因此,当使用TempData在重定向中保留数据时(为了使用Post-Request-Get模式),用户的某些其他请求是否可能在发送重定向的响应和用户的浏览器请求重定向页面?在这种情况下,get将不再具有TempData可用,对吗?
现在,我明白发生这样的事情是非常罕见的,但考虑到用户可能在另一个选项卡中打开了另一个页面,并且可能在该页面上发生了ajax或定时回调请求,它突然没有对我来说似乎不可能.它通常被认为是太遥远而无法担心,还是我误解了什么?
编辑:更具体地说明我所询问的场景.
在选项卡1中,用户浏览具有帖子表单的页面
在选项卡2中,用户浏览到站点上的另一个页面,该页面在计时器上执行ajax回调
在选项卡1中,用户将表单发布到服务器
当服务器收到帖子时,它会在TempData中保存一些数据并发回重定向响应
在选项卡2中,发生定时ajax回调,向服务器发送GET请求.TempData将从会话中删除
在选项卡1中,浏览器接收重定向并发出GET请求
服务器处理GET请求并查找TempData,但它不再存在
Aaron Lerch.. 9
好吧,浏览ASP.NET MVC代码显示while TempData存储在会话中,它在加载时从会话中删除.它会在Controller的ExecuteCore()方法中加载.
所以我认为这意味着是的,你完全可能遇到竞争条件,来自不同浏览器标签的请求(你有一个很好的例子)可能会导致这个问题.但这取决于每个浏览器处理请求的模型.浏览器可能会将对同一服务器的所有请求序列化,以便一次只执行一次.实际上,他们不会这样做,但是,他们会将其限制在最大值,这是(我认为)对同一服务器的5个并发请求.
鉴于ASP.NET MVC站点可能是对任何浏览器的服务请求(它是网络,毕竟:))这是一个真实的场景,尽管可能是一个罕见的,如你所说.
好吧,浏览ASP.NET MVC代码显示while TempData存储在会话中,它在加载时从会话中删除.它会在Controller的ExecuteCore()方法中加载.
所以我认为这意味着是的,你完全可能遇到竞争条件,来自不同浏览器标签的请求(你有一个很好的例子)可能会导致这个问题.但这取决于每个浏览器处理请求的模型.浏览器可能会将对同一服务器的所有请求序列化,以便一次只执行一次.实际上,他们不会这样做,但是,他们会将其限制在最大值,这是(我认为)对同一服务器的5个并发请求.
鉴于ASP.NET MVC站点可能是对任何浏览器的服务请求(它是网络,毕竟:))这是一个真实的场景,尽管可能是一个罕见的,如你所说.