【问题标题】:How can I set TTL for DNS Caching with Delphi SOAP webservices?如何使用 Delphi SOAP Web 服务为 DNS 缓存设置 TTL?
【发布时间】:2017-03-08 08:26:41
【问题描述】:

我有一个 Delphi 应用程序访问 Internet 上的 Web 服务。 上述服务的提供者现在已更改为基于云的基础架构,并向我提出以下要求:

"请在file $JAVA_HOME/jre/lib/security/java.security中配置networkaddress.cache.ttl如下:networkaddress.cache.ttl=60"

根据网络服务提供商的说法,这对于服务在任何情况下都能提供正确的结果是必要的。 他检查了我的应用程序的连接,在他看来,一旦启动它就会使用相同的 IP 地址。 重新启动应用程序确实解决了这个问题。

我一直在使用 IDE 提供的向导导入 WSDL,因此我使用 THTTPRIO 的实例来访问 Web 服务。 THTTPRIO 实例在主窗体的 FormCreate() 中创建。 该应用程序 24/7 全天候运行,并定期访问 Web 服务的多种方法。

Delphi SOAP 框架是否使用 DNS 缓存? 如果有,Java 中是否有类似networkaddress.cache.ttl 的属性?

是否有解决此问题的好方法(例如,在每次调用服务之前重新实例化包装类,而不是在 FormCreate 中只重新实例化一次)?

编辑: 该应用程序使用 Delphi 10.1 编译。柏林(最初使用 Delphi XE7 开发)。它在 Windows 7 机器上运行。

【问题讨论】:

  • 您是否在使用某种 delphi 框架?它是哪个操作系统?
  • 我正在使用 Delphi 附带的 SOAP 框架(Delphi 10.1 Berlin Enterprise ATM)。它在 Windows 7 上运行。
  • 哪个平台? (答案可能取决于操作系统)
  • 这是 Windows 7(刚刚添加到问题中)。

标签: web-services delphi caching soap dns


【解决方案1】:

你找到DnsFlushResolverCache了吗?

为了清除 DNS 解析器缓存,例如 IPCONFIG /flushdns 确实,以编程方式:

需要 dnsapi.dll,它需要 Win2000 或更高版本。像往常一样,MS 不记录 API

来源:http://brannockdevice.blogspot.de/2006/04/winxp-flushing-dns-programatically.html

【讨论】:

  • 谢谢!如果一个简单的重新连接证明是不够的,这可能会派上用场...
【解决方案2】:

我一直在深入研究源代码,我相信我找到了答案。 Delphi SOAP 框架本身似乎不做任何 DNS 缓存。 只是通过 Windows InternetConnect() 函数的第一个请求完成与 Web 服务的连接,并且从那时起存储和重用生成的句柄。

这里有更多关于此的背景信息:

THTTPRIO 类通过THTTPReqResp 的实例与 Web 服务通信:

property HTTPWebNode: THTTPReqResp read GetHTTPWebNode write SetHTTPWebNode;

THTTPReqResp 在每个请求之前调用Connect() 方法,该方法再次使用 WinApi 函数建立连接并将结果句柄存储在字段中:

FInetConnect := InternetConnect(FInetRoot, PChar(FURLHost), FURLPort, PChar(FUserName), PChar(FPassword), INTERNET_SERVICE_HTTP, 0, NativeUInt(Self));

但是 - Connect() 方法仅在尚未连接时才执行此操作 - 以下代码位于 Connect() 方法的开头:

if (FConnected) then
  Exit;

通过这样做,连接从第一个请求开始就保持打开状态。 以下请求只是使用来自InetConnect 的存储句柄。

对于我的云服务问题,创建我自己的 THTTPRIO 实例并将其传递给返回 Web 服务接口的函数就足够了:

RIO := THTTPRIO.Create(nil);
FM := GetFleetManagerAPISoap(FALSE, '', RIO);

然后每次调用任何网络服务函数之前我都会断开连接:

RIO.HTTPWebNode.Connect(FALSE);

理论上应该最终会通过InternetConnect() 建立新的连接,希望我的问题能够得到解决。 (不过还是要测试一下)

【讨论】:

    【解决方案3】:

    我认为您可以在 Windows 注册表中全局设置它。

    打开 regedit.exe 并导航到:

    HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters.
    

    在右侧窗格中,添加以下值:

    名称:默认TTL, 类型:REG_DWORD, 有效范围:1-255

    重新启动计算机。

    https://technet.microsoft.com/en-us/library/cc957530.aspx

    【讨论】:

    猜你喜欢
    • 2012-08-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-25
    • 2011-12-30
    • 1970-01-01
    相关资源
    最近更新 更多