IIS7 - обслуживает только одну страницу за раз. Это делает меня КРАЙС!

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

На некоторых машинах IIS7 IIS решает обслуживать только одну страницу за раз. Поэтому, если вы загружаете несколько страниц с сайта, каждый из них должен загружаться последовательно.

например. Если я загружаю http://foo.com/default.asp из одного браузера, а с другого компьютера загружаю http://foo.com/differenturl.asp, первый должен закончить, пока другой не загрузится. Это почти так же, как процесс w3p является однопоточным.

Обратите внимание, что в расширенных настройках IIS есть параметр, называемый MaxProcesses, в котором говорится: "Установите для этого больше 1, чтобы создать веб-сад" (что бы это ни было). Это НЕ решает проблему, потому что это порождает несколько процессов со своим собственным состоянием сеанса и т.д., И когда вы загружаете http://foo.com/default.asp, нет способа гарантировать вас присваивается одному процессу.

Проблема проявилась, потому что у нас есть диагностическая страница, написанная в ASP, которая создает и элемент управления ActiveX, который загружает URL-адрес на веб-сайт и возвращает результаты.

Итак, диагностика .asp загружается и в коде со стороны сервера создается небольшой веб-элемент управления, который загружает (думает об управлении XMLHTTP) default.asp на том же сервере.

Эта страница НИКОГДА не закончит загрузку, потому что сервер ждет завершения страницы diagnostics.asp, прежде чем она будет обслуживать страницу default.asp. Тупик!

Это отлично работает на всех машинах IIS6, и я считаю, что есть некоторые серверы IIS7, где он отлично работает.

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


Правильный ответ от AnthonyWJones: отладка серверной стороны была включена в IIS7. Это ставит IIS в однопоточный режим.

Ответы

Ответ 1

В диспетчере IIS нажмите на приложение в дереве.

Дважды щелкните ASP в разделе IIS.

Разверните "Свойства отладки"

Убедитесь, что для параметра "Включить отладку на стороне клиента" и "Включить отладку на стороне сервера" установлено значение "false".

Когда включена отладка, ASP ограничивается обработкой одного запроса одновременно одним поточным способом.

Ответ 2

Прежде всего: убедитесь, что вы проверили это с несколькими клиентами. Один компьютер одновременно выполняет только два HTTP-запроса на один и тот же сервер (IP-адрес). (Это определение RFC.)

Если это не решит вашу проблему, посмотрите в IIS7 → ASP → Сервисы → Свойства COM Plus → Выполнить в MTA. Попробуйте установить для этого параметра значение "True".

Надеюсь, что это поможет.

Ответ 3

Вы уверены, что у вас нет зависимости от кода, который вызывает тупик. Я видел это раньше, когда регистрация, соединения sql и т.д. Создают зависимость. Используйте perfmon и проверьте очередь чтения/записи на жестком диске, очередь чтения/записи памяти, чтобы убедиться, что что-то происходит.

Я бы очень рекомендовал Тесс Феррандез (ASP.NET Escalation Engineer - Microsoft), чтобы узнать больше о том, что такое происходит. Тесс забыла об этом больше, чем когда-либо узнает большинство людей.

Я думаю, что ваша проблема не связана с IIS, а что-то в вашем приложении, возможно, в вашем компоненте ActiveX. Убедитесь, что вы очистили свой компонент ActiveX. Вот фрагмент кода, который я использую для очистки после использования Excel (другой компонент Com). Помните, что Com не управляется.

    Private Sub ShutDownExcel()
    If objExcel IsNot Nothing Then
        objExcel.DisplayAlerts = True
        objExcel.Quit()
        System.Runtime.InteropServices.Marshal.ReleaseComObject(objExcel)
        objExcel = Nothing
    End If

    ' Clean up memory so Excel can shut down. 
    GC.Collect()
    GC.WaitForPendingFinalizers()

    ' The GC needs to be called twice in order to get the 
    ' Finalizers called - the first time in, it simply makes 
    ' a list of what is to be finalized, the second time in, 
    ' it actually the finalizing. Only then will the 
    ' object do its automatic ReleaseComObject. 
    GC.Collect()
    GC.WaitForPendingFinalizers()
End Sub

Надеюсь, что это поможет.

Ответ 4

IIS7 является наиболее достоверным многопоточным, поэтому я думаю, что есть проблема с вашим приложением.

Вы упомянули ActiveX для загрузки страницы с того же сервера - возможно, этот ActiveX не является бесплатным потоком, и это заставляет каждую страницу использовать его для запуска одного экземпляра?

BTW: Web Garden - тот же сервер, использующий несколько процессов - не может использовать сеанс inprocess Веб-ферма - несколько веб-серверов

Ответ 5

Убедитесь, что asp.net настроен на использование более одного рабочего потока. В этой статье msdn объясняется, как установить этот параметр конфигурации.

Ответ 6

Вы изменили "Управляемый конвейерный режим" в пуле приложений на "Классический" (по умолчанию "Интегрировано" )? Если нет, попробуйте с классическим.

Я не знаю, поможет ли это в любом случае. Я давно перестал бороться, чтобы получить классические приложения ASP для работы с IIS7. (Не то, что я могу сказать, приложения действительно хороши и правильны, но они работали в более ранних версиях.)

И попробуйте отключить буферизацию для тестовых страниц и заставить их выплевывать что-то на каждой итерации. Буферизация (и кеширование) может измениться в IIS7. Возможно, они обрабатываются одновременно, и просто буферы слишком велики, чтобы увидеть разницу.

Это все, что приходит мне на ум прямо сейчас.


Я предполагаю, что вы тестируете очень простой случай. В вашем приложении нет (ни тестовых страниц, ни global.asa) использовать какие-либо странные объекты, которые являются общими для обоих запросов, и поэтому требуется блокировка.

Ответ 7

Просто подумайте, но если вы перейдете на сайт в IIS, нажмите ссылку Limits... слева, каковы ограничения на соединение? Существует как максимальная пропускная способность, так и максимальные возможности параллельных соединений.

Я также перейду в Пул приложений и нажмите "Дополнительные настройки..." и проверьте пределы ЦП и памяти. Возможно даже создание нового пула приложений с нуля с отсутствием управляемого кода для его устранения.

Ответ 8

Если это не проблема с настройками отладки, я обнаружил, что вы можете наблюдать подобное поведение при использовании переменных сеанса в ASP в IIS 8.

Я не знаю, что это IIS 8, но "ASP гарантирует, что только один запрос с сеанса будет выполняться в любое время". http://msdn.microsoft.com/en-us/library/ms972335.aspx