【发布时间】:2017-01-14 03:19:14
【问题描述】:
我正在尝试在请求之间存储数据,以提供一种更新进程进度的方法。我正在尝试使用HttpContext.Session 对象来执行此操作。
这里有两个示例端点(忽略语法问题,这些都是编造的):
[HttpGet]
[Route("/getTest")]
public string GetTest()
{
List<Stuff> largeCollection = GetLargeCollection();
for(int i = 0; i < largeCollection.Count; i++)
{
//Do stuff
HttpContext.Session.SetString("progress", i + "/" + largeCollection.Count); // ie. 1/1000
}
return "done";
}
[HttpGet]
[Route("/getTest/progress")]
public string GetProgress()
{
return HttpContext.Session.GetString("progress");
}
如果我调用/getTest,它会启动一个长时间运行的进程,并根据进度更新progress 键。如果在此期间我调用/getTest/progress,则从GetString 方法返回的字符串为空。如果我在长时间运行的过程完成后调用进度端点,返回的字符串就是进度。
我希望Session 键可用,即使长时间运行的进程没有返回,或者它永远不会返回。
为什么会发生这种情况,我该如何解决?
【问题讨论】:
-
1.这只发生在您第一次写入/读取会话时?阅读:当你重复它时,它是否有效?在这种情况下,第一种方法无法设置标识会话的 cookie,因此您的第二个请求调用没有 cookie 的端点并且无权访问会话。 2. 不要将状态(会话或任何其他信息)与 WebAPI 式 API 一起使用,这违反了 RESTful api 原则,并且一旦您尝试扩展到多个实例,就会出现问题。每个请求都应该独立于先前的请求,并通过请求传递它需要的所有数据
-
@Tseng 每当我尝试将数据写入会话然后尝试在控制器方法返回之前读取它时,都会发生这种情况。就好像在方法运行之前对会话的更改没有“应用”。这是一个单页应用的内部API,不需要遵循RESTful规范,这样格式化URL结构很方便。
-
会话没有实时保存,它在请求结束时保存。它有一个 Commit 方法,你可以调用它来提前保存它。
-
哦!您可以将此添加为答案吗?另外,这是一个不好的问题,为什么它被否决了?
标签: c# session asp.net-core