Вопрос или проблема
Я запускаю WCF сервис на IIS. Сервис использует “webHttpBinding” и
<security mode="Transport">
<transport clientCredentialType="Windows" />
</security>
После этого я делаю несколько ajax вызовов из моего веб-приложения.
- запрос, который занимает очень много времени
- несколько коротких запросов каждые 1 секунду для обновления статуса
Я запускаю своё приложение на http://localhost, и всё работает отлично. Но когда я запускаю своё приложение на сервере по https://dev.server.com, запросы отправляются на сервер, но им приходится ждать, пока не завершится первый очень долгий запрос. Это приводит к очень долгим временам “ожидания ответа сервера” в коротких запросах.
Как такое может быть? Я имею в виду, что это тот же сервис и те же запросы – почему localhost работает параллельно, а с dev-сервера – последовательно?
Ответ или решение
Ваша проблема, вероятно, связана с ограничениями параллельных подключений, установленными на уровне сервера или конкретно в приложении с использованием WCF и IIS. При работе на localhost
к веб-сервису могут использоваться различные настройки, которые отличаются от тех, что применяются в продакшн-среде. Ниже я опишу несколько возможных причин и решений вашей проблемы.
Причины проблемы:
-
Ограничения на количество одновременных подключений: В IIS по умолчанию может быть разрешено ограниченное количество одновременных подключений для одного и того же клиента. Во время выполнения длительного запроса другие запросы могут блокироваться, пока этот запрос не будет завершен.
-
Проблемы с конфигурацией WCF: Конфигурации
serviceThrottling
могут ограничивать количество одновременных запросов к сервису, что может мешать выполнению других коротких запросов во время ожидания ответа на длинный запрос. - Синхронное выполнение: Если ваши AJAX-запросы выполняются синхронно, это может привести к блокировке остальных запросов. Убедитесь, что все ваши AJAX-запросы отправляются асинхронно.
Решения:
-
Настройка WCF для повышения производительности:
Проверьте и измените настройкиserviceThrottling
в файле конфигурации WCF. Например, добавьте или измените следующий элемент:<behaviors> <serviceBehaviors> <behavior> <serviceThrottling maxConcurrentCalls="100" maxConcurrentSessions="100" maxConcurrentInstances="100" /> </behavior> </serviceBehaviors> </behaviors>
-
Установка максимального количества соединений в клиенте:
Убедитесь, что вы не ограничены в количестве соединений по умолчанию для ваших AJAX-запросов. Для браузеров есть ограничение на количество параллельных соединений к одному домену. Наиболее часто используется 6 соединений. Убедитесь, что ваши запросы действительно отправляются параллельно. -
Использование Asynchronous Programming Model (APM):
Если ваш WCF сервис поддерживает асинхронные операции, убедитесь, что вы используете асинхронные методы и правильно обрабатываете их на стороне клиента. -
Фоновая обработка запросов:
Если у вас есть длинные запросы, рассмотрите возможность их обработки в фоновом режиме (например, с использованием очередей) и отправки статуса выполнения через другие более короткие запросы. -
Тестирование с другим сервером:
Попробуйте протестировать на другом сервере (не локальном), чтобы определить, возникает ли аналогичная ситуация. Это поможет сузить причину проблемы. - Профилирование и мониторинг:
Используйте инструменты профилирования и мониторинга, чтобы определить, где возникают задержки. Это может помочь выяснить, какие запросы блокируют другие и почему.
Заключение
Если предложенные решения не помогают, возможно, стоит рассмотреть применение прокси-сервера или балансировщиков нагрузки, которые могут помочь распределить запросы более равномерно и снизить нагрузку на один сервер. Надеюсь, приведенные рекомендации помогут вам решить проблему с последовательными запросами на сервере.