我的工具实际上是根据几个选项重写主机文件,这些值用于通过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,就像我说的,我认为这是应用程序正在缓存它。
答案 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();
}
}
}