来自.NET Reflector的System.Runtime.Remoting.Channels.CoreChannel.GetMachineIP() - 请解释

时间:2010-07-16 08:47:27

标签: .net

在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注册有关吗?

3 个答案:

答案 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>