题
我在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。 希望这有助于。
不隶属于 StackOverflow