问题
在做新闻发布系统的时候,遇到一个问题就是获取电脑ip,如下代码:
string com_content = txtcomment.Text;
string newsid = Request.QueryString["newsid"];
string userIp = Request.ServerVariables["REMOTE_ADDR"];
对于我而言,这个代码没有任何问题,可是在页面显示的时候,com_content、newsID都显示没有问题,只有userIp不能显示,并且,在提示的过程中出现: “::1”
错误的原因:由于我的系统是win8 64位操作系统,采用的是ipv6。
解决
- 利用 Dns.GetHostEntry 方法,由获取的 IPv6 位址反查 DNS 纪录,
- 再逐一判断何者为 IPv4 协议,即可转为 IPv4 位址。
public static string GetClientIP()
{
if (null == HttpContext.Current.Request.ServerVariables["HTTP_VIA"])
{
return HttpContext.Current.Request.ServerVariables["REMOTE_ADDR"];
}
else
{
return HttpContext.Current.Request.ServerVariables["HTTP_X_FORWARDED_FOR"];
}
}
public static string GetClientIPv4Address()
{
string ipv4 = String.Empty;
foreach (IPAddress ip in Dns.GetHostAddresses(GetClientIP()))
{
if (ip.AddressFamily.ToString() == "InterNetwork")
{
ipv4 = ip.ToString();
break;
}
}
if (ipv4 != String.Empty)
{
return ipv4;
}
foreach (IPAddress ip in Dns.GetHostEntry(GetClientIP()).AddressList)
//foreach (IPAddress ip in Dns.GetHostAddresses(Dns.GetHostName()))
{
if (ip.AddressFamily.ToString() == "InterNetwork")
{
ipv4 = ip.ToString();
break;
}
}
return ipv4;
}
思考
遇到问题,从根源入手去解决,多多利用自己手中的各种资源,不断培养自己解决问题的能力。并且,享受解决问题这个过程,在这个过程中得到提高,下次再碰到类似的问题,不至于手忙脚乱。