MVC 4: Как сохранить сеансы и файлы cookie, которые будут оставаться действительными после перезапуска IIS?

Кажется, что мой сеанс входа в систему (с использованием простого членства) и куки (токен проверки) недействительны после перезапуска сервера IIS. Это проблема для меня, если пользователь находится в середине транзакции, а затем перезагружается сервер, пользователь должен пополнить форму и сделать это снова, также это может быть некоторая проблема с кодом, когда транзакция прерывается в середине процесс.

Как сделать их действительными после перезапуска сервера?

Вот мой web.config:

<membership />
...
<sessionState mode="InProc" cookieless="false" timeout="2880" />
...
<authentication mode="Forms">
  <forms loginUrl="~/Account/Login" timeout="2880" />
</authentication> 
...
<staticContent>
  <clientCache cacheControlMode="UseMaxAge" cacheControlMaxAge="30.00:00:00" />
  <remove fileExtension=".woff" />
  <remove fileExtension=".woff2" />
  <mimeMap fileExtension=".woff" mimeType="application/font-woff" />
  <mimeMap fileExtension=".woff2" mimeType="application/font-woff2" />
</staticContent>

Update

Я попытался использовать SQLServer для хранения состояния сеанса. Тогда возникает новая проблема, которую я не могу использовать ViewBag, потому что это не Serializable.

Есть ли другой способ добиться этого?

Ответ 1

Невозможно достичь этого AFAIK. Вы всегда можете использовать Database или File, чтобы сохранить значения сеанса и файла cookie.

Идея может заключаться в сериализации объекта, который вы хотите сохранить в Session или Cookie. Существует много инструментов, которые делают сериализацию для вас, я использую newtonsoft. Затем сохраните его как строку в DB вместе с ключом сеанса.

Чтобы вернуть его, вы можете просто запустить запрос на основе ключа сеанса, получить строку и десериализировать ее, и все будет выполнено:)

Ответ 2

По умолчанию данные сеанса хранятся в памяти. Следовательно, вы потеряли его при перезапуске IIS. Вы можете подумать о другом поставщике услуг сеанса proc для хранения данных, например. база данных, служба sessionstate.

Ответ 3

Cookies хранятся в браузере клиентов и отправляются по каждому запросу на сервер. Поэтому файлы cookie доступны через перезапуски IIS или Recuples AppDomain.

Данные сеанса по умолчанию не сохраняются во время повторной обработки AppDomain или перезапуска IIS. Единственный способ добиться этого - использовать поставщика состояния сеанса, например, для сервера SQL.

Для этого провайдер состояния сеанса должен иметь возможность сериализовать/дезертилизовать ваши данные, чтобы сохранить и восстановить его из базы данных, это означает, что вам нужно использовать типы, которые можно сериализовать в вашем сеансе.

Вы можете изменить свой код, чтобы использовать другие типы, которые можно сериализовать или хранить ваши данные в cookie.

Ответ 5

Если вы получаете сообщение об ошибке, когда вы пытаетесь сохранить сеанс, значит, вы храните viewbag в сеансе. Вам действительно нужно? Я думаю, вам следует избегать хранения viewbag в сеансе и использовать вместо этого, если вы действительно хотите, свой собственный сериализуемый пользовательский класс. Может быть, общий словарь может уже соответствовать вашим потребностям... Затем сохраняйте свою сессию в базе данных, или если вы хотите повторно изобрести колесо, выполните свой собственный Поставщик хранилища состояний сеанса. В целом использование сеанса для хранения информации никогда не является хорошим практика по многим причинам, основные ваши данные теряются при перезапуске сервера. Насколько я могу понять в вашем веб-приложении, вы используете сеанс для хранения опубликованных данных, правильным способом является ретрансляция к классу viewmodel.

Ответ 6

localStorage (собственное хранилище браузера) может использоваться для хранения данных локально без использования файлов cookie.

Здесь ссылка W3Schools: https://www.w3schools.com/html/html5_webstorage.asp

Ответ 7

Сохранять сеансы в кластерной базе данных (мастер-мастер), так что это может быть неудачно.

Ответ 8

Просто вы не можете этого сделать, использование баз данных с ключевыми значениями - лучший выбор для хранения сессий в памяти (например, redis), и это намного быстрее, чем реляционные базы данных, такие как sql-сервер.

Сохранение данных в локальном хранилище или файлы cookie может привести к потере данных или проблемам безопасности.