【问题标题】:.net core controller action sharing values using HttpContext.net 核心控制器操作使用 HttpContext 共享值
【发布时间】:2020-07-22 17:27:32
【问题描述】:

我的应用程序中有两个控制器操作,FirstAction 和 SecondAction。
当调用 FirstAction 时,我想存储数据并希望在 SecondAction 中重用。
我已经尝试过 HttpContext 并且无法在 SecondAction 中获得价值。它总是返回 null 。

 public async Task<IActionResult> FirstAction()
        {
                HttpContext.Items.Add("Key1", myValue1);
                HttpContext.Items.Add("Key2", myValue2);
        }

 public async Task<IActionResult> SecondAction()
        {
               var _value1 =  HttpContext.Items["Key1"]?.ToString();
               var _value2 =  HttpContext.Items["Key2"]?.ToString();
        }  

这种场景有没有更好的方法?

【问题讨论】:

  • 你有理由必须使用 HttpContext 吗?为什么不将数据存储在控制器全局范围内的字典中?
  • @jawsofdoom ,是的,如果这是更好的方法,请作为答案发布或给我一些参考。
  • HTTP 上下文是指当前请求。您需要将数据存储在HttpContext.Session

标签: asp.net-core httpcontext


【解决方案1】:

HttpContext.Items 仅存储单个请求的数据。 From the docs 状态管理:

HttpContext.Items 集合用于在处理单个请求时存储数据。处理请求后,集合的内容将被丢弃。

只要用户的会话处于活动状态,您就可以store data in session state 将其从一个请求保留到下一个请求。你必须configure session storage first。 in-memory 选项仅对单个服务器有效。数据库或 Redis 存储适用于在负载平衡场景中使用的服务器群。

文档显示how to set and read session state 使用强类型方法,例如:

HttpContext.Session.SetString(SessionKeyName, "The Doctor");
HttpContext.Session.SetInt32(SessionKeyAge, 773);

var name = HttpContext.Session.GetString(SessionKeyName);
var age = HttpContext.Session.GetInt32(SessionKeyAge);

【讨论】:

  • 到期时。您在配置中指定超时时间。
  • 我已经搜索过更好的解决方案,例如使用 ViewData、TempData、Cookies。对于这种情况,HttpContext.Session 是不是更好的解决方案?
  • @StevenSann,不,不是更好,使用 session 对你的 webapp 来说可能是很大的开销。因此,这取决于您想要保持的状态的生命周期。对于像你这样的生命周期短的对象,TempData 会更好。
  • @Ryan ,在我的示例中,只有两个操作。后来,我可以有更多的 3 或 5 个动作,所以它不能被认为是短生命周期,对吧?
  • @StevenSann TempData 可以在后续请求中使用,之后将失效。由于您可能需要在接下来的 3 或 5 个操作中使用该值,我建议使用 session。
猜你喜欢
  • 1970-01-01
  • 2019-11-16
  • 2017-05-14
  • 1970-01-01
  • 2017-12-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多