Сессия и потоки
===============

Не удалось найти окончательный ответ на этот вопрос, когда клиентский сеанс установлен в приложении ASP.NET MVC2. Я предполагаю, что конкретный поток из пула потоков обрабатывает этот запрос. Тот же поток всегда обрабатывает все последующие запросы для этого сеанса? Итак, теоретически, если каким-то образом идентификатор сеанса был испорчен, а неправильный поток был выбран, то любые данные уровня сеанса будут отсутствовать?
Благодаря

 

Короче говоря, нет, не под IIS (я не могу ручаться за сервер веб-разработки Cassini в Visual Studio, но я тоже сомневаюсь)

Вы можете продемонстрировать изменение потока, добавив следующее в представление:

```
<%= System.Threading.Thread.CurrentThread.ManagedThreadId %>

```

Теперь несколько раз ударяйте страницу из своего браузера (или, возможно, ударяйте его из 2 или 3 браузеров), и вы увидите, что время от времени оно меняется.

Сказав это - в простом сценарии, например, вы можете часто видеть тот же поток, обслуживающий запрос, поскольку ASP.NET не создает больше потоков, чем нужно, но как только вы начнете загрузку сервера, вы будете см. несколько потоков.

 

Нет. Каждый запрос может обрабатываться другим потоком. Это означает, что различные ресурсы на странице могут обрабатываться различными потоками. Или они могут быть обработаны на одном и том же. Это зависит от рабочего процесса и iis, чтобы разобраться, стоит ли создавать новый поток или лучше подождать, пока он станет доступным.

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

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