2010-11-12 5 views
1

Существует информация о том, что происходит в сеансе InProc для удаления объектов сеанса, но это не то, что здесь происходит. Мы теряем отдельные переменные в стабильных объектах сеанса InProc и не уверены, не написаны они или не потеряны после успешной записи. Я подтвердил с помощью WinDBG, что сеансы живут и содержат некоторые, но не все, данные, написанные для них.IIS ASP.NET переменные сеанса InProc, случайным образом не записанные на сеанс

Guid g = System.Guid.NewGuid(); 
this.Context.Session.Add(g.ToString(), result.ImageData);   
output.Write("<img src=\"display.aspx?id=" + g.ToString() + "\">"); 

Этот код довольно прост, и он работает безупречно в тесте. В производстве, при большой нагрузке, он не достигает ~ 1% времени. Если мистер Смит посещает сайт и пытается отобразить 4 части данных изображения, 2 из них могут быть сохранены в его сеансе, а два из них будут потеряны.

Объект сеанса InProc для г-на Смита существует. Журналы трафика показывают, что он нажал 4 раза, каждый с другим параметром id. Но в его объекте сессии InProc есть всего 2 гида, а не 4. Два объекта сеанса, которые мы сделали, действительно соответствуют 2 идентификаторам, указанным в журнале трафика (его первый и третий клики). Журналы трафика для его 2-го и 4-й клик, однако, показывает идентификатор guid, который отсутствует в его объекте сеанса InProc.

Линии 1 & 3 из вышеуказанного кода явно работал для этих 2-го и 4-го кликов, или у него не было идентификатора в URI, чтобы он мог щелкнуть. Строка 2, похоже, каким-то образом провалилась. Если бы было исключено какое-либо исключение, я бы ожидал, что мы никогда не достигли строки 3. Я не вижу никакого способа получить идентификатор guid, но сеанс не будет иметь его. Другая возможность - строка 2 успешно работала, но переменная позже исчезла, как я даже не могу себе представить.

Может ли кто-нибудь подумать о чем-нибудь еще? Или, может быть, предложение о том, как воспроизвести такую ​​проблему?

Деталь: ASP.NET v3.5 IIS 6 Нет Web Садоводства Мы работаем веб-ферму, но пользователи постоянно возвращаться к одному серверу. Теперь я изучаю, есть ли способ, которым пользователи могут ускользнуть на другой сервер.

+1

Я бы поставил на человек декли соскальзывание к другому серверу. В прошлом видели что-то подобное, «липкие сеансы» не всегда делают то, что говорят на олове! –

+0

Учитывая высокую нагрузку, возможно ли, что у вас заканчивается память? Профилировали ли вы это? Кроме того, вы управляли фермой в разработке? – ScottE

+0

Да. Slip-скольжения. Я не являюсь сетевым парнем и неправильно понимал функцию глобального выбора сайта по сравнению с коммутатором контента. Мы живем и учимся. Что касается памяти, я глубоко вникал в это, так хорошее предложение. – codepoke

ответ

0

Ну, простой способ выяснить, связана ли проблема с балансировкой нагрузки и липким сеансом, - полностью прекратить ее использование и посмотреть, воспроизводится ли проблема.

Если это невозможно, вы можете сохранить сеанс из процесса [state server] и снова проверить сеансы. Я работал в Microsoft Global Technical Support и видел много случаев, когда липкая сессия просто не работает!

http://aspalliance.com/1182

+0

Да. Спасибо за идеи. Мы смотрим из proc, но отключить переключатель пока невозможно. – codepoke

+0

Это был действительно пользователь, собирающийся разными членами фермы. Мы используем глобальный селектор сайтов вместо нашего обычного решения маршрутизации содержимого. GSS отправляет один или другой IP-адрес в ответ на DNS-запрос клиента. TTL в этом DNS-ответе составлял 20 секунд, что означает, что ответ DNS истекает слишком рано, чтобы быть практичным. Кратковременное решение заключается в расширении TTL. Долгосрочным решением является управление сеансом вне процесса. – codepoke

0

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

http://www.asp101.com/tips/index.asp?id=165

+0

На самом деле решение machineKey работает с ViewState, а не с состоянием сеанса. InProc Session State не шифруется машинным ключом, поэтому это не повлияет на мою ситуацию. Наши машинные ключи уже давно работают на всех наших фермах. – codepoke