当我的主机文件在运行时发生更改时,我如何刷新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,所以正如我所说,我认为是应用程序在缓存它。

当我的主机文件在运行时发生更改时,我如何刷新dns

我启动了一个快速控制台应用程序,但似乎无法重现您看到的问题。正如你在下面看到的,这请求谷歌的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();
    }
}
}