如果未返回当前请求,则会话密钥值为null

时间:2017-01-13 06:14:18

标签: c# session asp.net-core

我试图在请求之间存储数据,以提供更新进程进度的方法。我正在尝试使用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 个答案:

答案 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");
}