跨重定向使用ASP.NETMVC TempData时是否存在“竞争条件”?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (22)

当使用TempData时,我的理解是,只要有一个请求,它就会保留你放入它的任何东西。因此,当使用TempData在重定向中保留数据时(为了使用Post-Request-Get模式),是否有可能在发送重定向的响应和用户的浏览器请求重定向页面?在这种情况下get将不再有TempData可用,是正确的?

现在,我知道类似这样的事情会非常少见,但考虑到用户可能会在另一个选项卡中打开另一个页面,并且可能在该页面上出现ajax或定时回调请求,它突然不会对我来说似乎都是不可能的。它通常被认为是太遥远而不担心,还是我误解了某些东西?

更具体地讲述我所问的场景。

  1. 在选项卡1中,用户使用帖子表单浏览到页面
  2. 在选项卡2中,用户浏览到站点上的另一个页面,该页面在计时器上执行ajax回调
  3. 在选项卡1中,用户将表单发布到服务器
  4. 当服务器收到帖子时,它将一些数据保存在TempData中,并发送一个重定向响应
  5. 在选项卡2中,发生定时ajax回调,向服务器发送GET请求。TempData将从会话中删除
  6. 在标签1中,浏览器接收重定向并发出GET请求
  7. 服务器处理GET请求并寻找TempData,但它不再存在
提问于
用户回答回答于

那么,浏览ASP.NET MVC代码就会发现,虽然TempData存储在会话中,但它在加载时会从会话中删除。并将其加载到Controller的ExecuteCore()方法中。

所以我认为这意味着是的,你完全可能会遇到竞争状况,其中来自不同浏览器选项卡(你有一个很好的例子)的请求可能会导致这个问题。但是,这取决于每个浏览器处理请求的模型。浏览器可能会将所有请求序列化到同一台服务器,以便一次只执行一次。实际上,他们不会这样做,但是,他们会将最大值限制在(我认为)5个并发请求到同一台服务器上。

假设一个ASP.NET MVC网站可能是任何浏览器的服务请求(这是网络,但是:)),这是一个真实的场景,尽管可能是罕见的,如你所说。

用户回答回答于

使用TempData时完全有可能产生竞争状态。但是,在正常使用情况下,必须“不幸”才能体验它。为了进入竞争状态,以下都是正确的:

  1. 必须先使用TempData。
  2. 必须打开多个浏览器窗口/选项卡/发送者并共享相同的浏览器会话。
  3. 来自第二个浏览器选项卡的请求必须“潜入”第一个浏览器选项卡的请求和响应之间。

请注意,项目#2在很大程度上取决于使用的浏览器。根据设置IE的方式,仅仅因为打开了多个窗口并不意味着它们共享浏览器Cookie,因此它们不一定共享会话(基于Cookie)。

但是,如果遇到爆炸事件,就没有竞争条件。你可以在一个请求中设置一些TempData,然后在你认为你会得到它的下一个请求中没有得到它。它只会是空的。

扫码关注云+社区