Использование сеанса Stateserver в веб-ферме ASP.NET
Я создал сайт онлайн-шоппинга, который будет развернут на веб-ферме. В результате я решил использовать систему управления сессиями Stateserver, предоставляемую ASP.NET. Теперь у меня есть страница входа. После успешного входа пользователя я перенаправляю его на страницу каталога, где он может впоследствии добавить книги в свою корзину.
Из того, что я понял, сессия хранится в форме пары ключ-значение. Итак, если я создаю сеанс для конкретного пользователя (скажем, его зовут "abc"), я бы сделал что-то вроде этого:
Session["abc"]=tmp; //where tmp is a "List" of items that "abc" has added to the cart
Теперь, после того как он перенаправлен на другую страницу, как мне получить этот сеанс? Из того, что я прочитал, я должен был написать:
temp=Session["abc"]
Как отправить это имя пользователя на другую страницу в качестве параметра. Так как это происходит в веб-ферме, клиент может быть подключен к разным серверам для каждого запроса, и одновременно может быть зарегистрировано несколько клиентов. Поэтому, если я создам сеанс для всех из них с соответствующими именами пользователей в качестве ключей, как я могу получить их сеансы, когда они просматривают разные страницы?
Я не думаю, что я понял точную работу идентификатора сессии, поэтому, если кто-то может мне помочь с этим, было бы здорово.
2 ответа
Как отправить это имя пользователя на другую страницу в качестве параметра.
Вам не нужно отправлять это. Объект Session не является частью ответа страницы, он живет на стороне сервера. Следовательно, вы можете установить его на странице A и получить его на странице B, используя тот же код, который вы указали:
Session["abc"]=tmp;
А также
temp=Session["abc"]
Поэтому, если я создам сеанс для всех из них с соответствующими именами пользователей в качестве ключей, как я могу получить их сеансы, когда они просматривают разные страницы?
Вы можете получить его тем же ключом, который вы использовали для хранения объекта в сеансе. На самом деле вы можете использовать один и тот же ключ для всех пользователей. Например:
username=Session["username"]
Примечание..Net извлекает нужный экземпляр для каждого объекта, используя уникальный идентификатор, который назначается каждому пользователю (SessionId пользователя). Это, однако, прозрачно для вашего кода.
В этом вопросе перечислено несколько ошибок при использовании StateServer Session
Если вы не используете липкие сеансы (имеется в виду, что после создания сеанса ваш балансировщик нагрузки будет поддерживать запрос всегда в одном и том же окне), вам необходимо убедиться, что в вашем файле web.config поставщик состояния OutOfProc настроен так, чтобы он указывал на IP-адрес сервера, на котором работает служба состояний ASP.NET - по умолчанию он указывает на localhost-
Кроме того, вам нужно убедиться, что все, что вы помещаете в Session, является Serializable (т.е. украшает ваши классы атрибутом [Serializable])
По своему опыту я всегда видел, как на балансировщике нагрузки включались липкие сессии, так как это самый простой подход. Если липкие сеансы не используются, то, вероятно, я бы использовал провайдера состояния SQL или что-то еще (какой-то другой продукт, который может выполнять де / сериализацию быстрее) для обработки этого.