当主机文件在运行时更改时,如何刷新dns?

时间:2014-11-04 22:46:31

标签: c# .net dns

我的工具实际上是根据几个选项重写主机文件,这些值用于通过dns与几个数据库之一进行通信,但问题是在工具的不同区域,我需要使用主机文件的当前值。不幸的是,似乎首次运行应用程序时出现的值都是使用的。

我试过冲洗dns,但似乎没有任何效果。我尝试过的方法是:

  • 设置超时

ServicePointManager.DnsRefreshTimeout = 0这实际上打破了一切。我根本无法与数据库通信。

  • 导入

    [DllImport("dnsapi.dll",EntryPoint="DnsFlushResolverCache")]
    private static extern UInt32 DnsFlushResolverCache ();
    

这似乎没有任何效果。

如何确保我的应用程序使用主机文件的当前值?

更新:要清楚,我不是在阅读主机文件以便使用它。 IP已更改,但应用程序在尝试连接到数据库时使用主机名。 e.g:

  • 127.1.1.14 MyDatabase位于主机文件中,该应用尝试与MyDatabase
  • 对话
  • 应用将主机文件更改为127.1.1.16 MyDatabase,该应用会尝试与MyDatabase通话,但它应该解析为.16,但它仍然会解析为.14

这似乎只会影响应用程序,这让我觉得它是第一次解析它时缓存DNS(即它第一次与数据库通信),这就是为什么我尝试以上述方式刷新dns,没有成功。如果我打开命令提示符ping MyDatabase -4,那么我会看到正确的IP地址解析。我使用我的应用程序更改主机文件的主机IP地址,然后ping MyDatabase -4,它显示正确的更新IP,就像我说的,我认为这是应用程序正在缓存它。

1 个答案:

答案 0 :(得分:0)

我掀起了一个快速的控制台应用程序,我似乎无法重现你所看到的问题。正如你在下面看到的那样请求google的IP,然后我留下一个打开的ReadLine,这样我就可以修改hosts文件了。然后回来,它将其读入一个新的变量,对我来说至少它当时拉出了当前在hosts文件中的内容。您是否可以在更新hosts文件之前将DNS条目读入应用程序,只是从该对象请求DNS信息而不是生成新的DNS信息? screenshot

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();
    }
}
}