Клиент Delphi SOAP не может хранить более 2 одновременных запросов. Как увеличить?
У меня есть многопользовательское приложение COM+, которое должно сделать несколько запросов на веб-сервисах SOAP. Каждый запрос SOAP может длиться от 10 до 60 секунд (это не под моим контролем). Проблема в том, что я никогда не могу сделать более 2 запросов одновременно.
когда у меня есть, например, 3 параллельных запроса, третьи запросы начинаются только тогда, когда заканчивается второй. Я наблюдал такое же поведение в консольном приложении (для целей тестирования), делая несколько одновременных запросов к тот же веб-сервис, и я снова был ограничен 2 запросами.
когда я пытался использовать те же веб-сервисы с другим языком (C#), то же самое произошло, но на клиенте C# есть свойство, которое решает проблему:
System.Net.ServicePointManager.DefaultConnectionLimit
когда я увеличил это свойство, я мог сохранить любое количество параллельных запросов, которые я хотел. Есть собственность похож на Делфи?
Я использую инструмент импорта WSDL для использования веб-служб (Delphi XE2 в).
2 ответов
Delphi использует Wininet.dll для выполнения запросов SOAP, IE использует ту же DLL. Это ограничение на самом деле документирована.
у вас есть 2 варианта:
- адаптировать реестр, как указано в статье КБ
- использовать
InternetSetOption
перед вызовом SOAP:
небольшой пример кода (обратите внимание, что он не включает проверку ошибок):
Const
INTERNET_OPTION_MAX_CONNS_PER_SERVER = 73;
INTERNET_OPTION_MAX_CONNS_PER_1_0_SERVER = 74;
var
MaxConnections : Integer;
begin
MaxConnections := 10; // adapt to your needs
InternetSetOption(Nil, INTERNET_OPTION_MAX_CONNS_PER_SERVER, @MaxConnections , SizeOf(MaxConnections ));
InternetSetOption(Nil, INTERNET_OPTION_MAX_CONNS_PER_1_0_SERVER, @MaxConnections , SizeOf(MaxConnections ));
// do SOAP call
end;
по умолчанию программы Delphi SOAP используют WinInet в Windows и Indy (TIdHTTP) на других платформах (см. директиву USE_INDY в SOAPHTTPTrans.pas unit), для связи с сервером. [1]
вы можете попробовать использовать Indy в Windows, определив USE_INDY и перекомпилировать библиотеку SOAP (однако я не сделал этого сам, поэтому подробные шаги для этого неизвестны мне).
p.s. связанная статья также указывает, что UseNagle должно быть установлено значение False.