Веб-сад и статические объекты трудно понять
Я нахожусь в процессе расследования, чтобы преобразовать наше веб-приложение в веб-ферму. Итак, я начал с веб-сада, преобразовав "Максимальный рабочий процесс = 3". Ниже приводится упрощенная версия моей проблемы.
Ниже приводится мой класс статических объектов.
public static class MyStaticObject
{
public static string MyProperty {get;set;}
}
Затем при загрузке страницы я инициализировал статические объекты следующим образом:
MyStaticObject.MyProperty = "My Static Property";
Затем с помощью asp.net ajax [WebMethod] создайте метод ajax на моей веб-странице.
[WebMethod()]
public static string getStaticProperty()
{
return MyStaticObject.MyProperty;
}
// Затем я вызываю этот метод Ajax с использованием Javascript и устанавливаю возвращаемое значение в текстовое поле.
Этот тест не работает, как ожидалось. Ниже приведены мои предположения и неправильный результат теста.
Я думал, что когда мы устанавливаем виртуальный каталог как веб-сад, то каждый запрос к виртуальному каталогу обрабатывается различным процессом в веб-саду, поэтому мои следующие несколько запросов к серверу должны возвращать ноль, так как я инициализировал статические объекты для одного рабочего процесс. Но даже если я нажму кнопку ajax 20 раз подряд (что означает 20 запросов), даже тогда статические объекты возвращают мне значение.
Правильно ли я предположил, что при перезапуске IIS должен убить все статические объекты.
Статические объекты не являются общими в веб-садах / веб-фермах.
Я удивлен поведением IIS, статических объектов и веб-сада.
Я предполагаю, что я ошибаюсь или мой метод тестирования неверен.
Благодарю.
1 ответ
Ваши предположения о том, как статические объекты управляются в AppPools / веб-садах, верны.
Однако ваше предположение о том, как распределяются веб-запросы, не соответствует действительности. HTTP-запросы циклически обрабатываются драйвером http.sys для рабочих процессов IIS, только когда устанавливается новое TCP-соединение, а не при поступлении нового запроса. Поскольку keepalive включены по умолчанию, даже если вы сделали 20 запросов подряд, они, вероятно, обслуживались одним и тем же рабочим процессом IIS.
IIS может отключить keepalive для целей тестирования из раздела HTTP Response Headers в IIS Manager, в разделе Set Common Headers. Это должно заставить ваш браузер открывать новое соединение для каждого запроса.
Чтобы протестировать с включенными сообщениями поддержки активности, вы можете использовать инструмент анализа емкости сети (WCAT), доступный в комплекте ресурсов IIS 6, для создания многопоточной нагрузки, которая обращается к обоим процессам IIS в вашем веб-саду.