在System.Runtime.Remoting.Channels.CoreChannel上使用.Net Reflector我反编译了下面的两种方法。在为远程处理设置HttpChannel时调用GetMachineIp()。
internal static string GetMachineIp()
{
if (s_MachineIp == null)
{
IPHostEntry hostEntry = Dns.GetHostEntry(GetMachineName());
AddressFamily addressFamily = Socket.SupportsIPv4 ?
AddressFamily.InterNetwork : AddressFamily.InterNetworkV6;
IPAddress machineAddress = GetMachineAddress(hostEntry, addressFamily);
if (machineAddress != null)
{
s_MachineIp = machineAddress.ToString();
}
if (s_MachineIp == null)
{
throw new ArgumentNullException("ip");
}
}
return s_MachineIp;
}
internal static string GetMachineName()
{
if (s_MachineName == null)
{
string hostName = GetHostName();
if (hostName != null)
{
IPHostEntry hostEntry = Dns.GetHostEntry(hostName);
if (hostEntry != null)
{
s_MachineName = hostEntry.HostName;
}
}
if (s_MachineName == null)
{
throw new ArgumentNullException("machine");
}
}
return s_MachineName;
}
我的问题是为什么GetMachineIP()中的Dns.GetHostEntry()会因SocketException而失败“没有这样的主机已知”。 GetMachineName()成功返回(也是GetHostEntry)。这只发生在一台孤立的机器上。这可能与错误的DNS注册有关吗?
答案 0 :(得分:1)
查看此MSDN文档中的注释:
http://msdn.microsoft.com/en-us/library/ms143998.aspx
它表示您需要DNS机器中的转发主机/ A条目。另一个条目说这在版本4.0中已经改变了。所以也许您可以尝试使用.NET Framework 4.0,看看它是否能解决您的问题。如果没有,请检查机器的DNS注册。
希望有所帮助!
答案 1 :(得分:1)
我可能遇到了同样的问题:设置.NET Remoting HttpChannel因隔离计算机上的“No such host is known”异常而失败。
原因是机器的名称。 GetMachineName返回“12”,然后由Dns.GetHostEntry解释为IP地址。更改计算机名称解决了问题。
计算机名称的错误可以通过IPAddress.Parse
解释为IP地址答案 2 :(得分:0)
这解决了我的问题:
在hosts文件中将计算机名称的映射添加到127.0.0.1(路径:“c:\ windows \ system32 \ drivers \ etc \ hosts”)
127.0.0.1 <computer name>