Проблема
В стеке, который мы повторно используем между проектами, мы помещаем в сеанс немного слишком много данных для передачи данных между страницами.Это было хорошо в теории, потому что он предотвращает взлом, повторные атаки и т. Д., Но создает столько проблем, сколько решает.
Потеря сеанса сама по себе является проблемой, хотя обрабатывается , в основном путем реализации Session State Server (или с помощью SQL Server).Что еще более важно, сложно заставить работать кнопку «Назад» правильно, и это также дополнительная работа, чтобы создать ситуацию, когда пользователь может, скажем, открыть один и тот же экран на трех вкладках для работы с разными записями.
И этотолько верхушка айсберга.
Для большинства из этих проблем есть обходные пути, но, как я понимаю, все эти трения дают мне ощущение, что передача данных между страницами с использованием сессии является неправильным направлением.
Что я действительно хочу сделать, так это придумать лучшую практику, которую мой магазин может использовать постоянно для передачи данных между страницами, а затем, для новых приложений, заменить ключевые части нашего стека, которые в настоящее время полагаются на Session.
Было бы также неплохо, если бы окончательное решение не привело к появлению множества кодексов трубопровода.
Предлагаемые решения
Сеанс
Как уже упоминалось выше, сильная опора на сессию выглядит какхорошая идея, но она ломает кнопку «назад» и вызывает некоторые другие проблемы.
Могут быть способы обойти все проблемы, но это кажется большой дополнительной работой.
Одна вещь, которая очень приятна в использовании сессии, это то, что вмешательство не является проблемой.По сравнению с передачей всего через незашифрованный QueryString, вы в конечном итоге пишете гораздо меньше защитного кода.
Кросс-страничка
По правде говоря, я почти не рассматривал этот вариант.У меня есть проблема с тем, насколько тесно он связывает страницы - если я начну делать PreviousPage.FindControl ("SomeTextBox"), это выглядит как проблема с обслуживанием, если я когда-нибудь захочу попасть на эту страницу с другой страницы, которая, возможно, не имеетэлемент управления с именем SomeTextBox.
Кажется, что он ограничен и другими способами.Может быть, я хочу перейти на страницу по ссылке, например.
QueryString
В настоящее время я склоняюсь к этой стратегии, как в старые времена.Но я, вероятно, хочу, чтобы моя QueryString была зашифрована, чтобы ее было сложнее подделать, и я хотел бы также решить проблему повторных атак.
Для 4 парней из Rolla, есть статья оэто .
Однако должна быть возможность создать HttpModule, который позаботится обо всем этом и удалит все шифровальные колбасы со страницы.Конечно же, У Мадса Кристенсена есть статья, в которой он ее выпустил. Однако комментарии заставляют его звучать так, как будто у него проблемы с чрезвычайно распространенными сценариями.
Другие параметры
Конечно, это не исчерпывающий взгляд на варианты, а основные варианты, которые я рассматриваю. Эта ссылка содержит более полный список.Те, которые я не упомянул, такие как Cookies и Cache, не подходят для передачи данных между страницами.
В заключении ...
Итак, как вы решаете проблему передачи данных между страницами?Какие скрытые ошибки вам приходилось обходить, и есть ли какие-то ранее существующие инструменты, которые безупречно решают их все? Делаете Вы чувствуете, что у вас есть решение, которым вы полностью довольны?
Заранее спасибо!
Обновление: Просто вв случае, если я не достаточно ясен, под «передачей данных между страницами», о которых я говорю, например, передачей ключа CustomerID со страницы CustomerSearch.aspx в Customers.aspx, где будет открыт Customer и возможно редактирование.