2013-07-25 7 views
0

У меня есть одно веб-приложение ASP.NET MVC 4 (MvcApplication, которое расширяет System.Web.HttpApplication), размещенное на IIS 8. Мое приложение работает в отдельном пуле приложений в режиме интегрированного конвейера. Максимальное количество рабочих процессов для этого пула приложений установлено равным 1.Сколько экземпляров веб-приложения работает в одном рабочем процессе?

Я понимаю, что экземпляры приложений могут быть объединены и может быть несколько параллельных потоков, которые вызовут Begin_Request/End_Request для того же экземпляра моего приложения (AppDomain) , Также я понимаю, что если я установил «Максимальное число рабочих процессов» более чем на 1, то будет определенно более одного экземпляра приложения (AppDomain).

Что я не понимаю, так это количество вызовов в Application_Start и сколько экземпляров моих статических переменных (хранимых в MvcApplication, а также некоторые синглтоны, такие как фабрика сеансов NHibernate и т. Д.) Будут существовать при заданном момент.

В настоящее время у меня есть некоторые проблемы с очисткой .NET MemoryCache. Некоторые пользователи моего веб-сайта получают старые значения из кеша, что заставляет меня думать, что может существовать более одного экземпляра моего глобального MemoryCache, даже если я установил «Максимальное число рабочих процессов» равным 1.

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

Есть ли какая-либо утилита или скрипт, который поможет мне перечислить все AppDomains в IIS?

ответ

1

Я не уверен, что это относится к вам, но методы HttpModule Initialize вызываются более одного раза, потому что хотя существует только один экземпляр приложения. Одна HttpApplication может порождать несколько экземпляров HttpModule, поэтому убедитесь, что эти инициализации являются потокобезопасными.

Application_Start и _End будут срабатывать только один раз для начала и остановки сайта с вашими текущими настройками, так что это не будет проблемой. Если вы используете объект HttpContext.Cache, вы можете иметь проблемы, упомянутые в этом ответе:

HashTable in HttpContext.Current.Cache

Если вы хотите, вы можете попробовать использовать WinDbg и получить дамп, что происходит в вашем процессе но это действительно тяжелая тактика, которая, вероятно, не прольет столько света, сколько просто просматривает код. Пока вы не посмотрите на это немного сложнее и все еще тупите ИМО.