2014-07-24 15 views
7

Tôi có một ứng dụng COM + nhiều người dùng cần thực hiện nhiều yêu cầu trên SOAP WebServices. Mỗi yêu cầu SOAP có thể kéo dài từ 10 đến 60 giây (điều đó không nằm trong tầm kiểm soát của tôi). Vấn đề là, tôi không bao giờ có thể thực hiện nhiều hơn 2 yêu cầu cùng một lúc.Delphi SOAP Client không thể giữ hơn 2 yêu cầu đồng thời. Làm thế nào để tăng?

Khi tôi có, ví dụ: 3 yêu cầu đồng thời, yêu cầu thứ ba chỉ bắt đầu khi yêu cầu thứ ba kết thúc. Tôi đã xem cùng một hành vi trên một ứng dụng bảng điều khiển (cho mục đích thử nghiệm) làm cho nhiều yêu cầu đồng thời cho cùng một WebService và tôi lại bị giới hạn trong 2 yêu cầu.

Khi tôi cố gắng tiêu thụ WebServices cùng với một ngôn ngữ khác (C#) cùng xảy ra, NHƯNG, trên # client C có một tài sản mà giải quyết vấn đề:

System.Net.ServicePointManager.DefaultConnectionLimit 

Khi tôi tăng mà tài sản tôi có thể giữ bất kỳ số lượng yêu cầu đồng thời nào tôi muốn. Có một tài sản tương tự như một trên Delphi?

Tôi đang sử dụng công cụ nhập WSDL để sử dụng Dịch vụ web (Delphi XE2).

+0

Thành phần nào bạn đang sử dụng thực thi điều kiện ests? Hiển thị một số mã. –

Trả lời

8

Delphi sử dụng Wininet.dll để thực hiện các yêu cầu SOAP của nó, IE sử dụng cùng một DLL. Giới hạn này thực ra là documented.

Bạn có 2 lựa chọn:

  • thích ứng registry như đã trình bày trong bài viết KB
  • Sử dụng InternetSetOption trước khi cuộc gọi SOAP:

mẫu mã nhỏ (xin lưu ý rằng nó không bao gồm kiểm tra lỗi):

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

Đoạn mã đó đã thực hiện thủ thuật. Cảm ơn nhiều! – lucasdclopes

5

Theo mặc định, các chương trình SOAP Delphi sử dụng WinInet trong Windows, và Indy (TIdHTTP) trong các nền tảng khác (xem chỉ thị USE_INDY trong đơn vị SOAPHTTPTrans.pas), để comunicate với máy chủ. [1]

Bạn có thể thử sử dụng Indy trên Windows bằng cách định nghĩa USE_INDY và ​​biên dịch lại các thư viện SOAP (tuy nhiên tôi đã không làm điều này bản thân mình vì vậy các bước chi tiết để làm điều này là không biết đến tôi).

p.s. bài viết được liên kết cũng chỉ ra rằng UseNagle nên được đặt thành False.

Các vấn đề liên quan