Подключение к веб-службе WCF происходит необъяснимо медленно
Моя компания в настоящее время переходит от традиционных веб-сервисов ASMX к веб-сервисам WCF, потому что нам нужна улучшенная обработка сложных типов, доступных с помощью WCF.
Исследуя проблемы с производительностью веб-страницы, я определил, что самым большим (с некоторым отрывом) провалом в производительности является первоначальное подключение к службе WCF. Когда я говорю начальный, я имею в виду следующий фрагмент кода, каждый раз, когда он вызывается, обновления страницы достаточно, чтобы получить медленный подключение:
$client = new SoapClient("<address-to-webservice>",
array('features' => SOAP_SINGLE_ELEMENT_ARRAYS));
Последующие вызовы методов в этом веб-сервисе выполняются быстро, однако соединение необъяснимо медленное.
На той же странице есть подключение к службе ASMX, размещенной на том же сервере, которая подключается намного быстрее.
Connection to WCF Webservice took 1.6509809494019 seconds //(this is just calling new SoapClient)
Connection to ASMX Webservice took 0.24430394172668 seconds
Calling ASMX->Method
ASMX->Method returned in 0.011564970016479 seconds
Calling WCF->Method1
WCF->Method1 returned in 0.011118173599243 seconds
Calling WCF->Method2
WCF->Method2 returned in 0.0038959980010986 seconds
Calling WCF->Method3
WCF->Method3 returned in 0.0041651725769043 seconds
Это работает во внутренней сети, и, очевидно, подключение извне происходит еще медленнее. Как вы можете видеть, подключение к веб-сервису WCF значительно медленнее.
Есть ли способ улучшить производительность (значительно) при подключении к веб-сервису WCF?
ОБНОВЛЕНИЕ:
Некоторая информация о клиенте WCF. Размещенный в IIS 7, Windows Server 2008. Используя базовую привязку wsHttpBinding (так как PHP SoapClient не поддерживает более сложную привязку wsHttpBinding). Соединение осуществляется с использованием протокола ssl.
Кроме того, при подключении через WCFSTORM соединение происходит намного быстрее, что наводит меня на мысль, что проблема, возможно, связана с PHP SoapClient.
2 answers
Просто предположение, основанное на вашем комментарии WCFStorm в вопросе, может быть, что WSDL, созданный версией ASMX, может быть проще для анализа, чем версия службы WCF. Я не знаю, создает ли PHP SoapClient динамически прокси-сервер из WSDL, но если WSDL, созданный ASMX и WCF, существенно отличается, это может привести к первоначальному узкому месту.
Наша проблема была решена путем исправления местоположения soap.wsdl_cache_dir
в php.ini.
Наши веб-сайты размещались и разрабатывались на компьютерах с Windows, поэтому каталог по умолчанию "/tmp" не работал. Изменение этого на C:\Windows\Temp это означало, что, хотя начальное соединение все еще медленное, все последующие запросы выполняются быстро.
Теперь мы рассмотрим более распространенное решение сценария разминки.