Значение сеанса в ASP.NET Core не обновляется, если это требуется со стороны клиента - PullRequest
0 голосов
/ 29 августа 2018

Я новичок в ASP.NET Core, и у меня проблема со значением сеанса. У меня есть значение, которое изменяется во время процесса и должно отображаться на экране (текст метки, который показывает, какой файл MS Word на сервере обрабатывается). Я храню это значение в сессии. При запуске процесса сеанс устанавливается в исходное состояние в JavaScript с помощью асинхронного вызова ajax:

    statusTextJS = "value from JavaScript...";
    $.ajax({
        url: "@Url.Action("SetStatusSession", "Sessions")",
        data: { statusText: statusTextJS },
        method: "POST",
        async: false
    });
    $("#labelStatus").text(statusTextJS);

и контроллер:

    [HttpPost]
    public void SetStatusSession(string statusText)
    {
        HttpContext.Session.SetString("status", statusText);
    }

Как только начальное значение сеанса установлено, я запускаю процесс с помощью аналогичного вызова ajax, это только контроллер (это только часть для тестирования: возвращаемые значения для отображения текста с записью в файлы журнала):

    [HttpPost]
    public string[] DoSomething(parameters...)
    {
        string[] returnValue = new string[4];

        WTLF.WriteToLogFile(_hostingEnvironment, HttpContext.Session.GetString("status"), true);
        HttpContext.Session.SetString("status", "value 1 from process controller");
        WTLF.WriteToLogFile(_hostingEnvironment, HttpContext.Session.GetString("status"), true);
        for (int i = 0; i < 900000000; i++) { }
        HttpContext.Session.SetString("status", "value 2 from process controller");
        WTLF.WriteToLogFile(_hostingEnvironment, HttpContext.Session.GetString("status"), true);
        for (int i = 0; i < 900000000; i++) { }
        HttpContext.Session.SetString("status", "value 3 from process controller");
        WTLF.WriteToLogFile(_hostingEnvironment, HttpContext.Session.GetString("status"), true);
        HttpContext.Session.SetString("status", string.Empty);

        return returnValue;
    }

Затем, во время процесса, на стороне клиента в JS I периодически (с помощью комбинации setInterval (...) и вызова ajax) проверяется значение сеанса, которое устанавливается в DoSomething (), это контроллер:

    [HttpGet]
    public ActionResult GetStatusSession(int count)
    {
        WTLF.WriteToLogFile(_hostingEnvironment, HttpContext.Session.GetString("status") + " - status from session controller - " + count, true);
        return Content(HttpContext.Session.GetString("status"));
    }

Проблема в том, что значение сеанса обновляется на стороне сервера, но если мне требуется это через ajax-вызов со стороны клиента, я всегда получаю начальное значение.

Это файл журнала (функция WriteToLogFile, он просто записывает в текстовый файл):

29.08.2018, 21:46:00 -> значение из JavaScript ...

29.08.2018, 21:46:00 -> значение 1 из контроллера процесса

29.08.2018, 21:46:01 -> значение из JavaScript ... - статус от контроллера сеанса - 0

29.08.2018, 21:46:01 -> значение из JavaScript ... - статус от контроллера сеанса - 1

29.08.2018, 21:46:02 -> значение из JavaScript ... - статус из контроллера сеанса - 2

29.08.2018, 21:46:02 -> значение из JavaScript ... - статус из контроллера сеанса - 3

29.08.2018, 21:46:03 -> значение 2 из контроллера процесса

29.08.2018, 21:46:03 -> значение из JavaScript ... - статус из контроллера сеанса - 4

29.08.2018, 21:46:03 -> значение из JavaScript ... - статус из контроллера сеанса - 5

29.08.2018, 21:46:04 -> значение из JavaScript ... - статус из контроллера сеанса - 6

29.08.2018, 21:46:04 -> значение из JavaScript ... - статус из контроллера сеанса - 7

29.08.2018, 21:46:05 -> значение 3 из контроллера процесса

Как видите, значение сеанса из процесса записывается правильно в файл журнала, но при вызове со стороны клиента оно всегда имеет значение «значение из JavaScript ...». Я искал в интернете, но я не нашел решения. Это один и тот же сеанс (с тем же ключом «status»), но требуемый асинхронный от разных контроллеров. Разве значение не должно быть одинаковым?

Надеюсь, это не глупый вопрос:)

Редактировать: я забыл упомянуть, что идентификатор сессии тот же, только значение отличается

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...