Delphi SOAP Client不能保留2个以上的并发请求。怎么增加?

时间:2014-07-24 14:23:40

标签: web-services delphi soap delphi-xe2 com+

我有一个多用户COM +应用程序,需要在SOAP WebServices上发出多个请求。每个SOAP请求可能持续10到60秒(这不在我的控制之下)。问题是,我永远不能同时发出超过2个请求。

例如,当我有3个并发请求时,第三个请求仅在第二个请求完成时才开始。 我在控制台应用程序上观察了相同的行为(用于测试目的),向同一个WebService发出多个并发请求,我再次被限制为2个请求。

当我尝试使用另一种语言(C#)使用相同的WebServices时,同样的情况发生了,但是,在C#客户端上有一个属性可以解决问题:

System.Net.ServicePointManager.DefaultConnectionLimit 

当我增加该属性时,我可以保留我想要的任意数量的并发请求。 Delphi上有类似的属性吗?

我正在使用WSDL导入器工具来使用Web服务(Delphi XE2)。

2 个答案:

答案 0 :(得分:8)

Delphi使用Wininet.dll发出SOAP请求,IE使用相同的DLL。 这个限制实际上是documented

您有两个选择:

  • 调整注册表,如KB文章中所述
  • 在SOAP调用之前使用InternetSetOption

小代码示例(请注意,它不包括错误检查):

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;

答案 1 :(得分:5)

  

默认情况下,Delphi SOAP程序在Windows和Indy中使用WinInet   (TIdHTTP)在其他平台上(参见USE_INDY指令)   SOAPHTTPTrans.pas单元),用于与服务器通信。 [1]

您可以通过定义USE_INDY并重新编译SOAP库来尝试在Windows上使用Indy(但我自己没有这样做,因此我不知道执行此操作的详细步骤。)

P.S。链接的文章还指出UseNagle应该设置为False。