Мы предоставляем веб-приложение, которое позволяет пользователям анализировать исходный файл. Общая структура выглядит следующим образом:
- пользователю предлагается загрузить файл (который хранится в переменной сеанса);
- пользователю предлагается сделать несколько выборов на основе предоставленного входного файла;
- пользователю предоставляется анализ.
Это работало отлично, до недавнего времени загружался файл большего размера (15 МБ). Файл все еще сохраняется в переменной сеанса от шага 1 до шага 2. Однако нажатие любой кнопки на шаге 2 приводит к потере переменной сеанса. Меньшие файлы работают по назначению.
Мы провели некоторое исследование, но следующее не должно быть проблемой:
- Мы не занимаемся вопросами тайм-аута;
- Мы не установили ограничение виртуальной памяти в нашем DefaultAppPool, и у нас достаточно оперативной памяти.
Для уточнения, я включил код ниже.
На шаге 2 мы проверяем наличие одной из переменных сеанса (с ключом CasesSessionKey) и создаем еще одну (с ключом GraphSessionKey). И то, и другое успешно сделано:
if (!HttpContext.Session.Keys.Contains(CasesSessionKey))
{
return RedirectToAction(nameof(Index));
}
var processMiningResult = HttpContext.Session.GetFromJson<ProcessMiningResult>(CasesSessionKey);
HttpContext.Session.SetAsJson(GraphSessionKey, graph);
Тогда на шаге 3 переменные сеанса отсутствуют. Меньшие файлы не имеют этой проблемы:
if (!HttpContext.Session.Keys.Contains(CasesSessionKey) ||
!HttpContext.Session.Keys.Contains(GraphSessionKey))
{
return RedirectToAction(nameof(Index));
}
Я ожидал, что обе переменные сеанса все еще доступны на шаге 3, но это не так. Что вызывает эту проблему?