Состояние сеанса ASP.NET и несколько рабочих процессов - PullRequest
22 голосов
/ 27 января 2010

Мне нужно кое-что понять о состоянии сеанса ASP.NET, так как оно относится к IIS 7 и ASP.net 3.5.

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

Конфигурация по умолчанию для IIS 7 - использовать состояние сеанса в процессе и выделить максимум 10 рабочих процессов. Тогда может показаться, что эта конфигурация по умолчанию должна работать. Я имею дело с компанией, которая разработала веб-приложение ASP.NET MVC, у которого есть некоторые проблемы, они обвиняют серверную среду. Утверждается, что, поскольку я использую настройки по умолчанию для 10 рабочих процессов, это нарушает их состояние сеанса. Мне нужно знать, действительно ли это точное утверждение. Я никогда не знал, что приложение ASP.NET не работает с конфигурацией по умолчанию, поэтому я немного растерялся и мне нужно это уточнить.

Ответы [ 4 ]

25 голосов
/ 27 января 2010

Наличие нескольких рабочих процессов и использование InProc не совместимы.

См. это :

Если вы включаете режим веб-сада, устанавливая атрибут true для webGarden в элементе processModel файла Web.config приложения, не используйте режим состояния сеанса InProc. В противном случае потеря данных может произойти, если разные запросы к одному и тому же сеансу обслуживаются разными рабочими процессами.

8 голосов
/ 27 января 2010

Более одного рабочего процесса - это «веб-сад». Состояние сеанса в процессе не будет работать правильно. Вам нужно будет использовать либо один рабочий процесс для своего веб-приложения, либо использовать сервер состояния сеанса, либо SQL Server для состояния сеанса.

5 голосов
/ 27 января 2010

Я могу ошибаться, но, насколько я знаю, по умолчанию у вас есть только 1 рабочий процесс на домен приложения с несколькими рабочими потоками для обработки запросов. В этом случае состояние сеанса In-Proc должно работать нормально (настройки по умолчанию).

Но если у вас есть несколько рабочих процессов (не только рабочие потоки, фактические рабочие процессы), вам нужно выйти из состояния сеанса процесса.

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

2 голосов
/ 26 сентября 2018

Я столкнулся с проблемой потери сеанса и, наконец, изо всех сил пытался найти основную причину.

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

Основная причина между настройкой рабочего процесса и состоянием сеанса. Здесь у нас есть 5 рабочих процессов, что означает, что при высокой нагрузке на сайт будут запущены 5 независимых процессов. Пока сеанс хранится в процессе, IIS не может гарантировать, что пользователь клиента будет использовать тот же рабочий процесс. Например, пользовательский клиент использует процесс A при первом посещении сети, а при втором посещении сети он может использовать процесс B. В процессе B сеанс не сохраняется, поэтому его сеанс потерян.

Почему все нормально, когда загрузка сайта низкая? Потому что IIS будет устанавливать только один рабочий процесс при низкой нагрузке. Так что сессия потерянной проблемы не произойдет. Это объясняет, почему все в порядке, когда я развертываю новую версию и тестирую ее ночью, но ошибка повторяется завтра утром. Потому что загрузка сайта ночью низкая.

Будьте осторожны при использовании состояния сеанса в Process, оно нестабильно, когда нагрузка на ваш сайт будет высокой, и это связано с несколькими рабочими процессами. Попробуйте что-то вроде State Serversession state.

...