Я новичок в 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»), но требуемый асинхронный от разных контроллеров. Разве значение не должно быть одинаковым?
Надеюсь, это не глупый вопрос:)
Редактировать: я забыл упомянуть, что идентификатор сессии тот же, только значение отличается