IIS7 - обслуживает только одну страницу за раз. Это делает меня сумасшедшим! - PullRequest
15 голосов
/ 25 февраля 2009

Ситуация: классическое приложение 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-адрес на веб-сайт и возвращает результаты.

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

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

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

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


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

Ответы [ 8 ]

29 голосов
/ 10 марта 2009

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

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

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

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

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

4 голосов
/ 06 марта 2009

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

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

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

2 голосов
/ 10 марта 2009

Вы уверены, что в вашем коде нет зависимости, которая вызывает тупик. Я видел это раньше, когда журналирование, соединения 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

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

0 голосов
/ 08 декабря 2014

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

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

0 голосов
/ 11 марта 2009

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

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

0 голосов
/ 11 марта 2009

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

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

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

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


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

0 голосов
/ 06 марта 2009

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

0 голосов
/ 26 февраля 2009

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

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

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

...