【问题标题】:Ip address of the client machine客户端机器的IP地址
【发布时间】:2010-04-19 18:58:02
【问题描述】:

请告诉我如何获取客户端 IP 地址,

我已经尝试了以下所有方法,但我得到了相同的输出:127.0.0.1

string strClientIP;
strClientIP = Request.UserHostAddress.ToString();

string strHostName = System.Net.Dns.GetHostName();
string clientIPAddress = System.Net.Dns.GetHostAddresses(strHostName).GetValue(0).ToString();

string ipaddress = string.Empty ;
ipaddress = Request.ServerVariables["HTTP_X_FORWARDED_FOR"];
if (ipaddress == "" || ipaddress == null)
    ipaddress = Request.ServerVariables["REMOTE_ADDR"];

我怎样才能得到正确的IP?

【问题讨论】:

标签: asp.net ip-address


【解决方案1】:

您使用REMOTE_ADDR 处于正确的轨道上,但如果您在本地访问该站点,它可能无法正常工作,它将显示本地主机。

REMOTE_ADDR 是包含您应该首先检查的客户端 IP 地址的标头。

您还应该检查 HTTP_X_FORWARDED 标头,以防您的访问者通过代理。请注意,HTTP_X_FORWARDED 是一个数组,可以包含多个逗号分隔值,具体取决于代理的数量。

这是一个小c# sn-p,显示确定客户端的ip:

 string clientIp = context.Request.ServerVariables["HTTP_X_FORWARDED_FOR"];
 if( !string.IsNullOrEmpty(clientIp) ) {
  string[] forwardedIps = clientIp.Split( new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries );
  clientIp = forwardedIps[forwardedIps.Length - 1];
 } else {
  clientIp = context.Request.ServerVariables["REMOTE_ADDR"];
 }

【讨论】:

  • 还要注意 System.Net.Dns.GetHostName 将获取您正在运行的本地计算机的地址!
  • 这是否意味着在部署到服务器后这段代码可以正常工作?字符串 ipaddress = string.Empty ; ipaddress = Request.ServerVariables["HTTP_X_FORWARDED_FOR"]; if (ipaddress == "" || ipaddress == null) ipaddress = Request.ServerVariables["REMOTE_ADDR"];
  • 不一定,HTTP_X_FORWARDED_FOR 可以是单个ip地址,也可以是ip地址数组,你可能需要考虑到这一点。否则我认为它应该可以工作,您始终可以尝试通过 IIS 在本地计算机上公开代码,然后通过另一台计算机连接以查看它报告的 ip。您可能还想考虑String.IsNullOrEmpty( ... ) 而不是(ipaddr = "" || ipaddr == null
【解决方案2】:

如果您通过本地主机地址连接,那么您的客户端地址也将报告为本地主机(因为它将通过环回适配器路由)

【讨论】:

    猜你喜欢
    • 2011-07-22
    • 1970-01-01
    • 1970-01-01
    • 2011-10-04
    • 1970-01-01
    • 2011-10-22
    • 2017-10-15
    • 2019-01-14
    相关资源
    最近更新 更多