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-адрес на веб-сайт и возвращает результаты.

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

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

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

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


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

Ответов (8)

Решение

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

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

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

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

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

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

Я очень рекомендую блог Тесс Феррандес (инженер по эскалации ASP.NET - 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

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

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

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

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

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

Кстати: веб-сад - один и тот же сервер, использующий несколько процессов - не может использовать сеанс внутри процесса. Веб-ферма - несколько веб-серверов.

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

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

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

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

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

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

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

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


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

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

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