Исчезновение данных сеанса InProc - PullRequest
2 голосов
/ 26 августа 2009

Я только что заметил это около недели назад. Я храню данные о текущей головоломке, в которую играет пользователь (www.wikipediamaze.com), например:

HttpContext.Current.Session.Add ("puzzleInfo", currentPuzzleInfo);

Я знаю, что хранение данных в сеансе с использованием режима «InProc» очень нестабильно и будет сброшено при каждом изменении web.config или при любом количестве других факторов, включая повторную пул приложений.

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

Есть идеи, что происходит? Было бы лучше, если бы он хранился непосредственно на клиенте в виде файла cookie? Пожалуйста, помогите.

Спасибо!

Ответы [ 2 ]

3 голосов
/ 26 августа 2009

Предложения Брайана превосходны, и я не могу согласиться с его замечаниями. Я также хотел бы предложить одну дополнительную возможность.

Вы много знаете о среде, в которой размещается ваше приложение? Я спрашиваю по следующей причине: учитывая, что вы находитесь в среде с общим хостингом, есть большая вероятность того, что ваш сайт обслуживает несколько веб-серверов. Если ваш сервер обслуживается несколькими серверами, и используется механизм балансировки нагрузки, который не поддерживает какую-либо привязку к сеансу, вы можете просто перейти на другой веб-сервер и начать новый сеанс; в конце концов, внутрипроцессная сессия не будет следовать за вами через боксы.

Пища для размышлений: -)

3 голосов
/ 26 августа 2009

Поиск и устранение неисправностей

Потеря данных каждые несколько секунд необычна, возможно, у вашего провайдера виртуального хостинга может возникнуть проблема - похоже, сервер почему-то постоянно прерывает сеансы. Вы можете отобразить sessionID (Session.SessionID) и посмотреть, изменится ли он.

Может произойти сбой процесса, вызванный кем-то еще на сервере. Вот сообщение в блоге msdn, посвященное устранению проблем такого типа (прокрутите вниз примерно на 25%): http://blogs.msdn.com/webtopics/archive/2009/07/22/in-proc-session-state-management.aspx

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

Как сказал Шон МакДоно:

... учитывая, что вы находитесь на виртуальном хостинге окружающая среда, есть достойный шанс что существует более одного веб-сервера хостинг вашего сайта. Если несколько серверов обслуживаем ваш сайт и нагрузку используется механизм балансировки, который не поддерживает никакой сессии близость, вы можете просто подпрыгивать на другой веб-сервер и запуск новый сеанс; в конце концов, в процессе сессия не будет следовать за вами через коробки.

Альтернативы государственному сопротивлению

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

Будьте осторожны с файлами cookie - файлы cookie передаются вместе с каждым запросом (изображения, сценарии и т. Д.) И должны быть сведены к минимуму. Вы можете подумать: «Мех, этот проект не нужно масштабировать», но как только вы примете проектное решение в рамках всего проекта, что вы собираетесь использовать куки для сохранения своего состояния, вы отправляетесь в круиз для пословиц.

И под этим я подразумеваю, что вы выходите из передового опыта и можете столкнуться с некоторыми уродливыми ситуациями, такими как то время, когда мне нужно было сохранить документ XML на секунду. Это не было бы хорошей идеей в печенье!

Если у вас нет способа настроить сервер состояний сеанса (что, впрочем, очень просто), потому что вы находитесь в среде общего хостинга, вы можете заглянуть в SqlSessionStateStore, который позволяет хранить данные вашего сеанса в SQL Server.

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