我在needsto获取客户端计算机的IPv4地址的asp.net应用程序的一些代码(用户都是我们自己的网络上)。最近,我们升级了应用程序运行在以Windows 2008 Server的服务器。现在Request.UserHostAddress代码时,客户端上的旧操作系统和IPv6时,他们在一个新的操作系统(Vista和更高版本)返回的IPv4。所以,在这个relys该功能可用于某些客户端,而不是其他。

我添加了应该从IPv6的转换为IPv4到尝试解决此问题的代码。这是从这个在线教程: http://www.4guysfromrolla.com/articles/071807-1的.aspx 使用.I'm dsn.GetHostAddress然后通过IPS循环返回的寻找一个是“互联网络”

foreach (IPAddress IPA in Dns.GetHostAddresses(HttpContext.Current.Request.UserHostAddress))
{
    if (IPA.AddressFamily.ToString() == "InterNetwork")
    {
        IP4Address = IPA.ToString();
        break;
    }
}

if (IP4Address != String.Empty)
{
    return IP4Address;
}


foreach (IPAddress IPA in Dns.GetHostAddresses(Dns.GetHostName()))
{
    if (IPA.AddressFamily.ToString() == "InterNetwork")
    {
        IP4Address = IPA.ToString();
        break;
    }
}

return IP4Address;

但问题是,这不是为我工作。从IPv4连接客户端继续返回客户端计算机的正确的IPv4的IP,但是从Vista和Windows 7连接客户端则返回的服务器的机器不是客户端计算机的IPv4 IP。

有帮助吗?

解决方案

简单答案:禁用IPV6在服务器上,或从DNS条目中删除的服务器的IPv6地址。

有不是魔术IPV4 < - > IPV6转换器。他们是完全不同的协议,并在一个地址没有转换到另一个。如果要可靠地获取客户端的IPv4地址,您需要确保客户端连接通过IPv4。

其他提示

我也已经复制了示例代码和同事指出,这显然是越野车。 此行使用服务器的主机名,因此不正确的结果:

foreach (IPAddress IPA in Dns.GetHostAddresses(Dns.GetHostName()))

我在我的项目校正的代码如下所示:

/// <summary>
/// Returns the IPv4 address of the specified host name or IP address.
/// </summary>
/// <param name="sHostNameOrAddress">The host name or IP address to resolve.</param>
/// <returns>The first IPv4 address associated with the specified host name, or null.</returns>
public static string GetIPv4Address(string sHostNameOrAddress)
{
  try
  {
    // Get the list of IP addresses for the specified host
    IPAddress[] aIPHostAddresses = Dns.GetHostAddresses(sHostNameOrAddress);

    // First try to find a real IPV4 address in the list
    foreach (IPAddress ipHost in aIPHostAddresses)
      if (ipHost.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork)
        return ipHost.ToString();

    // If that didn't work, try to lookup the IPV4 addresses for IPV6 addresses in the list
   foreach (IPAddress ipHost in aIPHostAddresses)
     if (ipHost.AddressFamily == System.Net.Sockets.AddressFamily.InterNetworkV6)
      {
        IPHostEntry ihe = Dns.GetHostEntry(ipHost);
        foreach (IPAddress ipEntry in ihe.AddressList)
          if (ipEntry.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork)
            return ipEntry.ToString();
      }
  }
  catch (Exception ex)
  {
    System.Diagnostics.Trace.WriteLine(ex);
  }
  return null;
}

上面的代码在ASP.Net 2.0在Windows 7 /服务器2008。 希望这有助于。

如果您使用的.NET 4.5框架然后有一个方法来提供IP6转换为IP4

public IPAddress MapToIPv4()

您可以找到详细的这里

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top