2014-07-24 10 views
7

Mam aplikację COM + dla wielu użytkowników, która musi wykonywać wiele żądań na usługach SOAP WebServices. Każde żądanie SOAP może trwać od 10 do 60 sekund (to nie jest pod moją kontrolą). Problem polega na tym, że nie mogę wykonać więcej niż 2 żądania w tym samym czasie.Delphi SOAP Client nie może przechowywać więcej niż 2 jednoczesnych żądań. Jak zwiększyć?

Kiedy mam na przykład 3 równoczesne żądania, trzecie żądanie rozpoczyna się dopiero po zakończeniu drugiego. Obserwowałem to samo zachowanie w aplikacji konsoli (do celów testowych), wysyłając wiele równoczesnych żądań do tej samej usługi WebService, a ja ponownie ograniczałem się do 2 żądań.

Kiedy próbowałem konsumować te same WebServices z innego języka (C#) to samo się stało, ale na # client C nie jest właściwością, która rozwiązuje ten problem:

System.Net.ServicePointManager.DefaultConnectionLimit 

Kiedy wzrosła że własność ja Mogę zachować dowolną liczbę równoczesnych żądań, których potrzebowałem. Czy istnieje własność podobna do tej na Delphi?

Używam narzędzia importera WSDL do korzystania z usług sieci Web (Delphi XE2).

+0

Który komponent używasz, który wykonuje polecenie ests? Pokaż trochę kodu. –

Odpowiedz

8

Delphi używa Wininet.dll do tworzenia żądań SOAP, IE używa tej samej biblioteki DLL. To ograniczenie jest w rzeczywistości documented.

Masz 2 możliwości:

  • dostosowania rejestru jak podano w artykule KB
  • Korzystanie InternetSetOption przed wywołaniem SOAP:

mały przykładowy kod (proszę pamiętać, że nie robi to sprawdzanie błędów):

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; 
+0

Ten kawałek kodu załatwił sprawę. Dziękuję Ci bardzo! – lucasdclopes

5

Domyślnie programy SOAP Delphi wykorzystuje WinInet w systemie Windows, a Indy (TIdHTTP) na innych platformach (patrz USE_INDY dyrektywy w SOAPHTTPTrans.pas jednostki), do komunikacji z serwerem. [1]

Można spróbować użyć Indy na Windows poprzez zdefiniowanie USE_INDY i skompilować bibliotekę SOAP (jednak nie zrobiłem tego ja tak szczegółowe kroki do zrobienia tego są mi znane).

p.s. połączony artykuł wskazuje również, że UseNagle powinno być ustawione na False.

Powiązane problemy