IIS не отправляет два ответа одному и тому же клиенту одновременно (только для ASP) - PullRequest
7 голосов
/ 19 июля 2009

У меня есть 2 ASP-страницы.

Я делаю запрос на первую страницу из Firefox (, который занимает 30 секунд для обработки на стороне сервера ), а в течение 30 секунд я делаю еще один запрос из Firefox на вторую страницу ( занимает менее 1 секунды на стороне сервера), но это происходит после 31 секунды. Потому что он ожидает первых запросов на завершение.

Когда я запрашиваю первую страницу из Firefox, а затем запрашиваю вторую страницу из IE, это просто мгновенно.

Таким образом, в основном ASP - IIS 6 каким-то образом ограничивает каждого клиента одним запросом ( длинная обработка запроса ) за раз. Мне нужно обойти эту проблему в моем клиентском приложении .NET.

Это проверено в 3 разных системах. Если вы хотите протестировать, вы можете попробовать ASP-скрипты в конце.

Это поведение одинаково при длительном выполнении SQL или просто при длительной операции ASP.

Примечание:

  • Речь идет не о HTTP Keep Alive
  • Речь идет не о постоянном ограничении соединения (мы пытались увеличить его в Firefox и в .NET с помощью Net.ServicePointManager.DefaultConnectionLimit)
  • Это не о User Agent
  • Это не происходит в ASP.NET, поэтому я предполагаю, что это что-то с ASP.dll
  • Я пытаюсь решить это на клиенте, а не на сервере. У меня нет прямого контроля над сервером, это стороннее решение.

Есть ли способ обойти это?

Пример кода ASP:

Первый ASP:

<%
Set cnn = Server.CreateObject("Adodb.Connection")
cnn.Open "Provider=sqloledb;Data Source=.;Initial Catalog=master;User Id=sa;Password=;"
cnn.Execute("WAITFOR DELAY '0:0:30'")
cnn.Close
%>

Второй ASP:

<%
Response.Write "bla bla"
%>

Ответы [ 3 ]

9 голосов
/ 20 июля 2009

Это связано с тем, как ASP управляет сессиями. Объект Session является однопоточным и, следовательно, может быть доступен только одному рабочему потоку за раз. Когда второй запрос поступает для того же сеанса, который уже обрабатывается существующим потоком, этот запрос помещается в очередь ASP до тех пор, пока объект сеанса не станет доступным.

Это происходит по умолчанию, даже если вы не используете объект сеанса на рассматриваемых страницах.

Следовательно, когда вы делаете один запрос из FF, а другой из IE, у вас будет два разных сеанса, поэтому оба запроса могут выполняться одновременно. Вы могли бы получить тот же эффект, используя два разных экземпляра IE.

Если вы знаете, что вам никогда не нужен объект сеанса, вы можете зайти в конфигурацию приложения и отключить его (это будет означать, что ни одна страница ASP никогда не коснется объекта сеанса). В этом случае ASP позволит одновременно обрабатывать несколько запросов от одного и того же экземпляра браузера (поскольку он не сможет узнать, что запросы были из одного и того же экземпляра браузера).

Однако в большинстве случаев ASP-код имеет некоторое применение для объекта сеанса (даже просто для маркировки сеанса как зарегистрированного). В этом случае вы застряли с таким поведением, если только вы не разделяете две ASP-страницы, вызываемые в отдельные приложения.

0 голосов
/ 19 июля 2009

IIS (или данный веб-сайт) настроен на 1 макс. одновременные соединения?

0 голосов
/ 19 июля 2009

Вы пытались использовать Response.Flush ? Это может привести к немедленной отправке буферизованного вывода.

...