Использование файлов cookie для хранения сеанса в ASP MVC

Сохранение всего сеанса в cookie-файлах было стандартом в Rails в течение последних нескольких лет - есть ли простой способ добиться чего-то подобного с помощью ASP MVC?

По умолчанию все, что есть в Session / TempData, хранится в памяти на сервере. В web.config это можно изменить на кеш хранилища SQL / на стороне сервера. Я бы хотел, чтобы эти объекты сохранялись в файле cookie.

Похоже, я мог бы реализовать собственный поставщик хранилища состояний сеанса. Есть подход попроще?


person Christopher Stott    schedule 30.10.2009    source источник
comment
Вы хотели ввести «весь сеанс в куки»?   -  person codeulike    schedule 30.10.2009


Ответы (6)


да, реализуйте настраиваемый поставщик сеанса состояния. И нет, черт возьми, нет более простого подхода.

Пс. это не так плохо, как кажется, т.е.> половина образца odbc пишет в базу данных.

person eglasius    schedule 10.11.2009
comment
После этого я реализовал настраиваемый поставщик сеанса состояния, и это было действительно просто. Спасибо за помощь. - person Christopher Stott; 17.11.2009

Я думаю, было бы намного эффективнее просто сохранить идентификатор сеанса (хэш или что-то еще) в файле cookie, а затем использовать этот идентификатор для получения данных сеанса из памяти / базы данных / любого хранилища, которое вы предпочитаете. Сохранение полного состояния сеанса в файле cookie без необходимости увеличивает пропускную способность.

Кроме того, помните о безопасности: если файл cookie содержит информацию для аутентификации или другие конфиденциальные данные, и вы не будете осторожны, он может быть легко взломан пользователем, чтобы получить привилегии или иным образом испортить ваше приложение (шифрование данных тоже отстой, потому что тогда вы должны кодировать зашифрованные данные в кодировке base-64, что дополнительно расходует полосу пропускания и время обработки). Вы не должны никогда доверять вводу пользователя.

person axel_c    schedule 10.11.2009
comment
Будет ли необходимо в этом случае настраиваемое хранилище состояний сеанса или имеет смысл просто отключить сеанс в web.config? - person O.O; 16.01.2011

Я бы настоятельно не рекомендовал хранить всю сессию в файлах cookie. Это плохо сказывается на производительности. Учтите следующее: каждый запрос (к каждому ресурсу) будет содержать накладные расходы, связанные с возможно устаревшими данными, которые вам понадобятся только один или два раза. В конечном итоге эти накладные расходы скажутся на ваших пользователях, вашей пропускной способности и производительности вашего сайта.

Вот пример:

GET / HTTP/1.1
Host: localhost
OtherUsefulHeaders: foo
Cookie: YourSessionState=...

Первоначальный размер запроса составляет около 200 байт. Допустим, вы добавляете к сеансу около 100 байт. Теперь размер составляет 300 байт, а накладные расходы составляют ~ 30%. Вы добавляете еще 100 байт, и накладные расходы составляют 50%. Это означает, что для отправки запроса требуется примерно вдвое больше времени, а пропускная способность - в два раза.

Вам лучше заглянуть в реализация TempData на основе файлов cookie, поскольку она занимает меньше места и имеет смысл.

person DreamSonic    schedule 10.11.2009
comment
Как будет быстрее поддерживать информацию о сеансе через TempData (реализованную через хранилище файлов cookie)? Также есть дополнительные накладные расходы на код для поддержки этого TempData. Сеанс должен быть достаточно легким - в нашем случае это несколько десятков байтов, поэтому накладные расходы на запрос должны быть минимальными. Хранилище сеансов на основе файлов cookie было принято в качестве стандарта в Rails в 2007 году. В этой статье обсуждается, почему они сделали этот шаг. ryandaigle.com/ article / 2007/2/21 / - person Christopher Stott; 10.11.2009
comment
Я очень рад за сообщество Rails, но моя точка зрения основана на статистических данных: yuiblog.com/blog/2007/03/01/performance-research-part-3. TempData имеет преимущество перед сеансом в том, что его накладные расходы применяются только один раз - во время обхода страницы. В противном случае куки должны быть чистыми. В любом случае, после горького опыта в сценарии веб-фермы я вообще не использую Session, это того не стоит. - person DreamSonic; 11.11.2009
comment
какой метод вы используете сейчас для состояния сеанса? Я бы подумал, что объект сеанса (независимо от того, inproc или нет) или файл cookie - единственный выбор? - person UpTheCreek; 05.01.2011
comment
@UpTheCreek - я пишу код, который не зависит от состояния сеанса. Каждый фрагмент информации может быть либо перестроен из запроса (включая файлы cookie), либо сохранен в кэше / базе данных (если повторный расчет требует больших затрат). - person DreamSonic; 06.01.2011

Я рекомендую хранить TempData в файле cookie (в отличие от всего сеанса).

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

На самом деле существует пакет nuget (который выполняет эту настраиваемую реализацию за вас): BrockAllen. CookieTempData и это документация. Этот пакет хорош тем, что он сжимает и шифрует ваш TempData, поэтому вам не нужно беспокоиться об отправке обычного текста через Интернет.

Все, что вам нужно сделать, это установить пакет nuget, а затем переопределить CreateTempDataProvider в вашем ControllerBase классе:

using BrockAllen.CookieTempData;

namespace myProject.web.Controllers
{
    public class ControllerBase : Controller
    {
        // use CookieTempDataProvider instead of default provider
        protected override ITempDataProvider CreateTempDataProvider()
        {
            return new CookieTempDataProvider();
        }
    }
}
person Hooman Bahreini    schedule 15.06.2018

Вы должны использовать для этого не сеансы, а профили. Профили используют файлы cookie для сопоставления компьютеров с профилями и т. Д. Ключ профиля хранится в файле cookie и не теряется при закрытии браузера и т. Д.

Информация здесь; http://odetocode.com/articles/440.aspx

person Jan Jongboom    schedule 10.11.2009

зависит от того, какие данные вы хотите сохранить в cookie, если вы хотите просто сохранить строку, следующий код подойдет:

HttpCookie cookie = new HttpCookie("username","sth");
            cookie.HttpOnly = true;
            cookie.Expires = DateTime.Now.AddMonths(3);
            HttpContext.Current.Response.Cookies.Add(cookie);
person tuanvt    schedule 30.10.2009