使用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代码显示while TempData存储在会话中,它在加载时会从会话中删除。它将被加载到Controller的ExecuteCore()方法中。

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

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

其他提示

使用TempData时完全有可能出现竞争条件。但是,你当然必须“不走运”。在正常使用情况下体验它。为了进入竞争状态,必须满足以下条件:

  1. 您必须首先使用TempData。
  2. 您必须打开多个浏览器窗口/标签/ whatevers并共享同一个浏览器会话。
  3. 来自第二个浏览器标签的请求必须“潜入”在第一个浏览器选项卡的请求和响应之间。
  4. 请注意,第2项很大程度上取决于您使用的浏览器。根据您设置IE的方式,仅仅因为您打开了多个窗口并不意味着它们共享浏览器cookie,因此它们不一定共享会话(基于cookie)。

    但是,如果遇到某些事情会导致爆炸,就没有竞争条件。这可能是Haacked所指的。但是你可以遇到竞争条件,因为你在一个请求中设置了一些TempData,然后在你想到你要去的下一个请求中没有得到它为拿到它,为实现它。它只是空的。

    谢谢, Eilon

TempData使用Session对象,它不会遇到这个问题,AFAIK。你有没遇到这个问题?

我认为它永远不会发生,但在开始时我也有同样的困惑。想想如果你在调试模式下运行你的mvc web应用程序,那么你在重定向动作中设置一个断点。你给tempdata一个值,那么你将在重定向viewResult和另一个视图中得到tempdate,你会发现其他请求永远不会被响应,直到重定向动作完成。那是什么意思?它说mvc应用程序在单线程模式下运行,它可以一次处理一个请求。所以上面提到的场景永远不会发生。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top