当我的主机文件在运行时发生更改时,我如何刷新dns
本文关键字:何刷新 dns 刷新 文件 主机 我的 运行时 | 更新日期: 2023-09-27 18:29:12
我的工具实际上基于几个选项重写了主机文件,这些值用于通过dns与几个数据库中的一个进行通信,但问题是,在工具的另一个区域,我需要使用主机文件的当前值。不幸的是,应用程序首次运行时出现的值似乎都是被使用的值。
我试过刷新dns,但似乎没有任何效果。我尝试过的方法有:
- 设置超时
ServicePointManager.DnsRefreshTimeout = 0
这实际上破坏了一切。我根本无法与数据库通信。
-
导入
[DllImport("dnsapi.dll",EntryPoint="DnsFlushResolverCache")] private static extern UInt32 DnsFlushResolverCache ();
这似乎没有任何效果。
如何确保我的应用程序使用主机文件的当前值?
更新:需要明确的是,我并不是为了使用主机文件而读取主机文件。IP会被更改,但应用程序在尝试连接到数据库时会使用主机名。例如:
127.1.1.14 MyDatabase
在主机文件中,应用程序尝试与MyDatabase
通话- 应用程序将主机文件更改为读取
127.1.1.16 MyDatabase
,应用程序尝试与MyDatabase
对话,但它应该解析为.16,但它仍然解析为.14
这似乎只会影响应用程序,这让我认为它在第一次解析DNS时(即第一次与数据库对话时)正在缓存DNS,这就是为什么我尝试以上述方式刷新DNS,但没有成功。如果我打开命令提示符和ping MyDatabase -4
,那么我会看到正确的IP地址解析。我使用我的应用程序更改该主机的主机文件的IP地址,然后更改ping MyDatabase -4
,它会显示正确的更新IP,所以正如我所说,我认为是应用程序在缓存它。
我启动了一个快速控制台应用程序,但似乎无法重现您看到的问题。正如你在下面看到的,这请求谷歌的IP,然后我留下一个打开的ReadLine,这样我就可以修改主机文件。然后回来,它将其读取到一个新的变量中,至少对我来说,它提取了当时hosts文件中当前的内容。您是否可能在更新主机文件之前读取应用程序中的DNS条目,并简单地从该对象请求DNS信息,而不是生成新的信息?屏幕截图
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Net;
namespace ConsoleApplication9
{
class Program
{
static void Main(string[] args)
{
string hostName = "google.com";
Console.WriteLine(hostName);
string myIP = Dns.GetHostEntry(hostName).AddressList[0].ToString();
Console.WriteLine("My IP Address is: {0}", myIP);
Console.ReadLine();
Console.WriteLine("Updating Host file");
string newIP = Dns.GetHostEntry(hostName).AddressList[0].ToString();
Console.WriteLine("My IP Address is: {0}", newIP);
Console.ReadLine();
}
}
}