【问题标题】:Delphi SOAP Client can not keep more than 2 concurrent requests. How to increase?Delphi SOAP Client 不能保持超过 2 个并发请求。如何增加?
【发布时间】:2014-07-24 14:23:39
【问题描述】:

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

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

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

System.Net.ServicePointManager.DefaultConnectionLimit 

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

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

【问题讨论】:

  • 您使用哪个组件来执行请求?显示一些代码。

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


【解决方案1】:

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

你有两个选择:

  • 按照知识库文章中的说明调整注册表
  • 在 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;

【讨论】:

    【解决方案2】:

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

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

    附言链接的文章还指出 UseNagle 应该设置为 False。

    【讨论】:

      猜你喜欢
      • 2020-01-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-30
      相关资源
      最近更新 更多