Как использовать управление сессиями с Load Balancer в Asp.Net - PullRequest
2 голосов
/ 12 марта 2012

У меня четыре разных сервера и балансировщик нагрузки. Я хочу использовать контроль капчи. Я сделал что-то с этим так:

Я создал handler.ashx для создания изображения капчи. Этот обработчик используется на главной странице. Я сохраняю пароль контрольного кода в сеансе при создании контрольного кода. Затем я сравнил пароль, введенный пользователем, с паролем в сеансе. Работает очень хорошо, но только на одном сервере.

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

Например:

A, B, C и D - четыре сервера. Балансировщик нагрузки направляет первый запрос к серверу. Который открывает главную страницу с сервера и создает пароль «123456». Это хранится в сеансе на сервере. Затем пользователь набрал пароль и нажал кнопку. Теперь балансировщик нагрузки направляет этот запрос на B-сервер. Поскольку сессия в B Sever пуста, пароли не совпадают.

Мой web.config имеет это,

<sessionState mode="StateServer" stateConnectionString="tcpip=127.0.0.1:42424"/>

Но это все еще не работает.

Что мне делать?

Ответы [ 3 ]

4 голосов
/ 12 марта 2012

Итак, первое (просто чтобы убедиться) - я считаю, что эта строка подключения является лишь примером, потому что 127.0.0.1 является localhost и у нее не будет шансов на работу;).

Теперь я предполагаю, что вы выбрали сервер A для своего сервера состояний. Пожалуйста, проверьте следующие вещи:

  • «Служба состояний ASP.NET» запущена и работает на сервере A (по умолчанию она отключена, проверить это можно в разделе «Администрирование» -> «Службы»)
  • stateConnectionString на серверах B, C и D: "tcpip = [IP-адрес или сетевое имя сервера A]: 42424" (это может быть 127.0.0.1 только на сервере A)
  • серверы могут обмениваться данными друг с другом по протоколу TCP / IP через порт 42424 (брандмауэры и т. Д.)

Пожалуйста, помните, что если вы изменили конфигурацию «Службы состояний ASP.NET» на сервере A, чтобы не использовать порт по умолчанию (42424), вы должны отразить это в строках подключения.

Иногда проще настроить «Режим сервера SQL» вместо «Режим сервера состояний», так что вы можете рассмотреть это. Вы можете найти более подробную информацию здесь .

1 голос
/ 12 марта 2012

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

http://www.hanselman.com/blog/LoadBalancingAndASPNET.aspx

0 голосов
/ 12 марта 2012

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

  1. Настройте службу состояний ASP.Net на компьютере, который вы хотите использовать в качестве сервера состояний.

    net start aspstate

  2. Изменить режим сеанса в файле Web.Config для всех веб-приложений и указать StateServer

<system.web>
    <!-- ... -->
    <sessionState
        mode="StateServer"
        stateConnectionString="tcpip=your_server_ip:42424"
        cookieless="false"
        timeout="20" />
    <!-- ... -->
</system.web>

3. Все веб-серверы используют одинаковую <machinekey> конфигурацию

<machineKey 
  validationKey="1234567890123456789012345678901234567890AAAAAAAAAA"
  decryptionKey="123456789012345678901234567890123456789012345678"
  validation="SHA1"
  decryption="Auto"
/>

( Примечание : чтобы поддерживать состояние сеанса на разных веб-серверах в веб-ферме, укажите путь приложения к веб-сайту (например, \ LM \ W3SVC \ 2) в информационных службах Интернета Microsoft ( Метабаза IIS) должна быть одинаковой для всех веб-серверов в веб-ферме. Случай также должен быть одинаковым, поскольку путь к приложению учитывает регистр. [http://support.microsoft.com/kb/325056])

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