ASP .NET Core MVC:RedirectToAction上的请求会发生什么

时间:2016-11-11 17:53:43

标签: asp.net-core-mvc

我试图整天在控制器之间传递数据,但现在我觉得我还不太了解基础知识。

在整个ASP .NET核心的文档中,他们使用“请求”一词。我假设这是由WebServer的客户端发出的HttpRequest。

还有一些不同的东西应该被绑定到请求的生命周期:

  • HttpContext及其HttpContext.Items字典。
  • 通过依赖注入添加了AddScoped的服务。
  • TempData字典? (不太确定)

但是在尝试传递数据时,我发现当我return RedirectToAction(...); HttpContext更改HttpContext.GetHashCode()具有不同的值时),TempData更改并且通过AddScoped添加的服务也是新对象。

这表明在RedirectToAction上发出新请求,再次执行请求管道的所有步骤。我的期望是,RedirectToAction仅使用不同的控制器操作继续当前请求管道。

我还认为浏览器或任何客户端只提出了一个请求,并在整个过程中得到了一个响应。

那么在控制器动作中调用RedirectToAction并返回结果时实际发生了什么?

更新 使用TempData工作,但必须首先配置TempDataProvider。例如,将services.AddSingleton<ITempDataProvider,SessionStateTempDataProvider>();添加到Startup.cs。谢谢@RonC。

2 个答案:

答案 0 :(得分:2)

如前所述,RedirecToAction会导致浏览器发出新请求,当新请求进入时,它会创建一个全新的HttpContext。如上所述,要在两个请求之间传递数据,您可以使用查询字符串,会话或cookie。但还有另一种选择需要考虑。

<强> TempData的
数据可以通过控制器操作方法中可访问的TempData集合从一个请求传递到另一个请求。 TempData集合专门用于将数据从一个请求传递到另一个请求。 TempData的美妙之处在于放置在TempData中的对象的生命周期恰好是一个额外的请求。因此,请求1中的TempData中的任何内容都将存在于请求2中,但在请求2结束时会自动从TempData中删除。这使得TempData非常适合从一个请求传递数据另一个不必在查询字符串中披露该信息,或者可能在会话中忘记它并使会话对象膨胀。

答案 1 :(得分:1)

保存当前请求的状态是不可能的,因为...... HTTP是无状态的。每个RedirectToAction都会告诉浏览器发出另一个HTTP请求。正如documentation所说。

  

返回对浏览器的HTTP 302响应,这会导致浏览器向指定的操作发出GET请求。

如果您想在HTTP请求之间传递一些数据,则必须使用cookie或会话机制。