16

使用 TempData 时,我的理解是它只会为一个请求保留您放入其中的任何内容。因此,当使用 TempData 跨重定向保留数据时(为了使用 Post-Request-Get 模式),是否有可能来自用户的其他一些请求可能会在发送重定向的响应和发送重定向的响应之间进入服务器?用户的浏览器请求重定向到的页面?在这种情况下,get 将不再有可用的 TempData,对吗?

现在,我知道发生这样的事情非常罕见,但考虑到用户可能在另一个选项卡中打开了另一个页面,并且该页面上可能发生了 ajax 或定时回调请求,它突然不会在我看来这一切都是不可能的。它只是通常被认为太遥远而无法担心,还是我误解了什么?

编辑:更具体地说明我所询问的场景。

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

4 回答 4

9

好吧,浏览 ASP.NET MVC 代码显示,虽然 TempData 存储在会话中,但在加载时从会话中删除。它被加载到控制器的 ExecuteCore() 方法中。

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

鉴于 ASP.NET MVC 站点可能是对任何浏览器的服务请求(毕竟是网络 :)),它是一个真实的场景,尽管可能很少见,正如您所说。

于 2008-10-25T02:31:02.027 回答
4

使用 TempData 时完全有可能出现竞争条件。但是,您当然必须“不幸”才能在正常使用下体验它。为了进入竞争条件,以下条件必须全部为真:

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

请注意,第 2 项很大程度上取决于您使用的浏览器。取决于您如何设置 IE,仅仅因为您打开了多个窗口并不意味着它们共享浏览器 cookie,因此它们不一定共享会话(基于 cookie)。

但是,从某种意义上说,如果遇到某些东西会爆炸,则不存在竞争条件。这可能就是 Haacked 所指的。但是,您可能会遇到竞争条件,即您在一个请求中设置了一些 TempData,然后在您认为会得到它的下一个请求中没有将其取回。它只会是空的。

谢谢,艾隆

于 2008-10-27T00:43:23.343 回答
0

TempData 使用 Session 对象,它不会遇到这个问题,AFAIK。你遇到过这个具体的问题吗?

于 2008-10-25T00:42:06.723 回答
0

我认为这永远不会发生,尽管一开始我也有同样的困惑。想想如果你在调试模式下运行你的 mvc web 应用程序,那么你在重定向操作中设置一个断点。然后你给 tempdata 一个值,然后你会在redirect viewResult和other view中得到tempdate,你会发现在redirect action完成之前,其他请求永远不会被响应。那么这是什么意思?它说mvc应用程序以单线程模式运行,它可以处理一个一次请求一次。所以你提到的上述场景永远不会发生。

于 2009-08-06T07:25:37.983 回答