【问题标题】:ASP.NET: get external IP addressASP.NET:获取外部 IP 地址
【发布时间】:2013-04-03 14:43:53
【问题描述】:

我开发了网站。我需要获取网站访问者的 IP。 我尝试使用 Request,但它只有内部 IP:

Response.Write(Request.ServerVariables["REMOTE_ADDR"]);

我查看了服务器变量集合中的所有键 - 结果相同:

foreach (string var in Request.ServerVariables)
{
    Response.Write(Request[var]);
}

如何获取外部 IP 地址?

【问题讨论】:

  • 我发现了问题。我使用了 VPN 连接,这就是 ServerVariables 返回我内部 IP 的原因。我关闭了 VPN 连接,它返回了正确的外部 IP。

标签: c# asp.net ip


【解决方案1】:

您可以使用它来获取外部(公共)IP 地址..

public static string getExternalIp()
    {
        try
        {
            string externalIP;
            externalIP = (new WebClient()).DownloadString("http://checkip.dyndns.org/");
            externalIP = (new Regex(@"\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}"))
                         .Matches(externalIP)[0].ToString();
            return externalIP;
        }
        catch { return null; }
    }

【讨论】:

  • 直截了当。酷。
  • 我发现checkip.dyndns.org 非常慢并且经常无法响应。为此,我建议在外部网络服务器上使用一个简单的 PHP 页面;相同的输出,但更可靠。
  • 刚刚仔细检查了 checkip 域没有问题,加载大约需要 523 毫秒,所以我认为这已经足够了。
【解决方案2】:

这是我实现 WebTracking 的一部分。因此,在这里您可以使用 sn-p 进行 IpAddress 检索。您可以在 Wikipedia 上阅读有关服务器变量的更多信息。

    /// <summary>
    /// Get ip address from request
    /// </summary>
    /// <param name="request"></param>
    /// <returns></returns>
    private string GetIpAddress(HttpRequest request)
    {
        if (request.ServerVariables.IsNull()) return null;

        var _realAddress = request.ServerVariables[@"HTTP_X_FORWARDED_FOR"];
        if (_realAddress.IsNullOrEmpty())
        {
            _realAddress = request.ServerVariables[@"HTTP_FORWARDED"];
        }
        if (_realAddress.IsNullOrEmpty())
        {
            _realAddress = request.ServerVariables[@"REMOTE_ADDR"];
        }

        return _realAddress;
    }

【讨论】:

    【解决方案3】:

    您是否支持负载平衡器/代理?如果是这样,请检查请求的 headers 集合中是否存在类似于 X-FORWARDED-FOR 的标头。

    【讨论】:

      【解决方案4】:

      你可以这样使用

      String lstrIpAddress;
      if (Request.ServerVariables["HTTP_X_FORWARDED_FOR"] != null || Request.ServerVariables["HTTP_CLIENT_IP"] != null)
          lstrIpAddress = Request.ServerVariables["HTTP_X_FORWARDED_FOR"];
      else
          lstrIpAddress = Request.ServerVariables["REMOTE_ADDR"];
      

      【讨论】:

      • 没用。 Request.ServerVariables["HTTP_X_FORWARDED_FOR"] - 返回 null 并且 Request.ServerVariables["REMOTE_ADDR"] 返回内部 IP
      • 这仅适用于 ASP 页面(这是问题所要求的,但我想我会提到这一点)。
      【解决方案5】:

      您可以简单地使用这个 nuget 包。 https://www.nuget.org/packages/IpPublicKnowledge/

      简单易行。这是一个例子:

      // Get Public IP
                  var ip = IPK.GetMyPublicIp();
      
                  //Get all IP infos
                  var IPinfo = IPK.GetIpInfo(ip);
      
                  //print some info
                  Console.WriteLine("*--------------------------- IPK -----------------------------*");
      
                  Console.WriteLine("My public IP : " + IPinfo.IP);
                  Console.WriteLine();
                  Console.WriteLine("My ISP : " + IPinfo.isp);
                  Console.WriteLine();
                  Console.WriteLine("My Country : " + IPinfo.country);
                  Console.WriteLine();
                  Console.WriteLine("My Languages : ");
      
                  foreach (var lang in IPinfo.languages)
                  {
                      Console.WriteLine(" " + lang.Key + " : " + lang.Value);
                  }
      
                  Console.WriteLine("*-------------------------------------------------------------*");
                  Console.Read();
      

      【讨论】:

      • 这将获取服务器的 IP 地址,而不是使用网站的客户端的 IP 地址。
      猜你喜欢
      • 2021-11-20
      • 2016-03-10
      • 2011-03-16
      • 2011-02-25
      • 2014-01-25
      • 1970-01-01
      • 2013-08-04
      • 2023-03-05
      相关资源
      最近更新 更多