我试图在请求之间存储数据,以提供更新进程进度的方法。我正在尝试使用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
键可用。
为什么会发生这种情况,我该如何解决?
答案 0 :(得分:-1)
根据我的经验'for'循环推迟将值写入文件,直到它完成迭代。因此,我建议您调用函数,传递要按顺序存储的值以保存会话字符串以供检索。
public void StoreSessionProgress(string progress)
{
HttpContext.Session.SetString("progress", progress);
}
[HttpGet]
[Route("/getTest")]
public string GetTest()
{
List<Stuff> largeCollection = GetLargeCollection();
for(int i = 0; i < largeCollection.Count; i++)
{
//Do stuff
StoreSessionProgress(i + "/" + largeCollection.Count)
}
return "done";
}
[HttpGet]
[Route("/getTest/progress")]
public string GetProgress()
{
return HttpContext.Session.GetString("progress");
}