TempData: это безопасно?
Я использую TempData
, чтобы сохранить мою модель при использовании RedirectToAction
. Он отлично работает, но я чувствую, что это может быть неправильным. Я действительно стараюсь избегать использования данных сеанса, и я прочитал, что TempData
использует сеанс. Безопасно ли использовать? Существуют ли проблемы, которые могут возникнуть при использовании его в сбалансированной нагрузке среде?
Вопрос о мелочах: "Это безопасно?" - назовите фильм.
Ответы
Ответ 1
Да, TempData поддерживается хранилищем сеансов, поэтому, если вы находитесь в среде с балансировкой нагрузки, при использовании ее необходимо соблюдать особую осторожность (липкие сеансы, постоянное состояние сеанса и т.д.).
TempData является де-факто выбором при использовании шаблона PRG и для чего он предназначен.
Что касается того, правильно ли это делать... это зависит от вашего варианта использования!
PS Марафон.
Ответ 2
Хорошо, я бы сказал, что это зависит. Если вы обрабатываете множество трафика с помощью балансировщика нагрузки и нескольких серверов переднего плана, то объекты сеанса следует избегать, поскольку это может ухудшить производительность и затруднить масштабирование по горизонтали (запрос фермы не всегда приходит на тот же веб-сервер).
TempData недолговечна, и если вы не ставите туда много объектов и дважды думайте обо всей архитектуре, я думаю, что тогда это безопасно. Там много сайтов, которые используют его широко и не имеют проблем с ним (я работал на общих и выделенных хостинговых сайтах, до 50 - 70 тыс. Посетителей в день, которые используют сеанс, часто с сетью и db на том же сервере).
Ответ 3
Я бы пошел, когда это возможно, для полностью безгражданского подхода. Он более масштабируемый и не затрагивается проблемами с отдельными серверами. Как правило, вы можете просто использовать cookie (правильно защищенный от несанкционированного доступа), чтобы идентифицировать пользователя и извлекать данные из базы данных каждый раз.
Кроме того, я также предлагаю вам оценить, можете ли вы использовать View
вместо RedirectToAction
. Это:
TempData["model"] = model;
return RedirectToAction("SomeAction");
Можно заменить на:
return View("SomeAction", model);
Конечно, предполагая, что "SomeAction" - это допустимое представление, доступное из текущего контроллера (это либо представление в том же ctrl, либо одно из разделенных в Shared) и что это не просто промежуточное действие, перенаправляемое на другое.
Ответ 4
Состояние сеанса может работать в кластерной среде, при условии, что произойдет одна из двух событий
Вопрос о том, следует ли использовать tempdata или нет, это совсем другой вопрос. Я бы сказал, что, как правило, это происходит вокруг. Если вы пытаетесь избежать попадания в базу данных, чтобы перезагрузить объект, который уже загрузил одно действие, используйте вместо этого кеш.
Ответ 5
Я ограничил использование TempData для передачи сообщения проверки модели объекта между представлениями и действиями. Я не рассматривал использование Tempdata с точки зрения безопасности, но после того, как SO-поток обсудит то же самое: HttpContext.Items с ASP.NET MVC. См. Последние комментарии к потоку и связанные с ними обсуждения.