以编程方式清除 WinInet DNS 缓存

Posted

技术标签:

【中文标题】以编程方式清除 WinInet DNS 缓存【英文标题】:Clear WinInet DNS cache programmatically 【发布时间】:2012-05-17 05:09:49 【问题描述】:

WinINet 库缓存通过它访问的任何 URL 的 IP 地址。因此,当该 URL 的 IP 地址发生更改时,WinInet 库的 HttpSendRequest 也会转到较旧的 IP 地址。

而且,如果旧 IP 正在响应,则 WinINet 将仅将所有 http 请求发送到旧 IP。

有什么方法可以强制清除 WinInet 的 DNS 缓存?

或者

有什么方法可以强制 WinINet 向指定的 IP 地址发送 HTTP 请求(因为我们可以使用 gethostbyname() 获取更新的 IP)?

注意:

    gethostbyname 给了我更新的 IP 地址,所以 WinINet 的缓存正在发生这种行为。 我尝试了this MS article 中建议的“方法 2”,但没有帮助 Sample code

【问题讨论】:

这有点像贫民窟,但你能生成一个单独的进程吗?这是命令行:ipconfig /flushdns @Tom ipconfig /flushdns 仅刷新系统 DNS 缓存。但是 WinInet 维护着自己的 DNS 缓存,不能用这个命令清除。 我不知道!抱歉,祝你好运 【参考方案1】:

您可以尝试在连接时使用flag:

INTERNET_FLAG_DONT_CACHE = 0x04000000 不添加返回的实体 到缓存。这与首选值相同, INTERNET_FLAG_NO_CACHE_WRITE。

或者您可以查看 WinInet 文档here中的 DeleteUrlCacheEntry

我相信这应该可以解决问题。

--更新

来自this doc我看到有更好的flag可以使用,看看:

INTERNET_FLAG_PRAGMA_NOCACHE 强制请求由源服务器解析,即使代理上存在缓存副本。

--更新

正如@Pradeep 测试的那样,您可以更改此注册表项以使其工作: HKCU\Software\Microsoft\Windows\CurrentVersion\Internet Settings\DnsCacheEnabled ServerInfoTimeOut 和 DnsCacheTimeout 为 0。

【讨论】:

你试过 DeleteUrlCacheEntry 了吗? 它看到 wininet.dll 从以下位置读取注册表项 DnsCacheEnabled: SOFTWARE\Microsoft\Windows\CurrentVersion\Internet Settings\5.0\Cache and SOFTWARE\Policies\Microsoft\Windows\CurrentVersion\Internet Settings\5.0 \使用 Security_HKLM_only 缓存 我没有看到 WinInet 在其路径中使用任何带有 DnsCacheEnabled 的键。如果您指出任何提到这一点的文档,这将很有帮助。 我在 PE Explorer 中看到过这个,抱歉我忘了说。 DnsCacheEnabled 存在于HKCU\Software\Microsoft\Windows\CurrentVersion\Internet Settings 中。但是为了完成这项工作,我还必须将ServerInfoTimeOutDnsCacheTimeout 设置为0。谢谢你的帮助。你能修改你的答案,让我接受吗?

以上是关于以编程方式清除 WinInet DNS 缓存的主要内容,如果未能解决你的问题,请参考以下文章

如何以编程方式清除 WinInet SSL 状态(是不是有 Windows API 调用)?

如何以编程方式清除缓存?

如何以编程方式清除浏览器缓存?

Sitecore - 以编程方式清除用户的缓存

有没有办法以编程方式清除所有缓存文件?

在 Linux 中以编程方式清除挂载 (SSD) 磁盘上的缓存