Клиент 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.