Request.UserHostAddress返回Load Balancer的IP地址

时间:2013-03-08 15:35:07

标签: c# request load-balancing

我的网站中有一个关键的代码行,它在我们的开发环境中工作,但不适用于生产。好吧,我说它在开发中有效,但事实是它给了::1,这是IPv6环回地址。

无论如何,我想要做的是捕获访问该网站的用户的IP地址。因此,我使用Request.UserHostAddress来做到这一点。在开发方面,正如我所说,它给了我回送地址,这是正确的,因为我从我的机器运行该站点。在现场它做了一些完全不同的事情。它总是返回负载均衡器的地址。

我想要了解的是这一点。使用Request.UserHostAddress来捕获用户的IP地址或者我们的网络设置有什么问题或者其他什么我错了吗?

谢谢,

萨钦

3 个答案:

答案 0 :(得分:9)

在您自己的应用程序中,如果没有其他任何方法可以帮助您,那么您就会陷入困境。这是您可以获得的尽可能多的信息。

如果您很幸运,您的负载均衡器已配置为添加一个或多个额外标头,其中包含有关原始请求的信息。

一个常见的解决方案是X-Forwarded-For标题:

  

X-Forwarded-For(XFF)HTTP头字段是用于识别通过HTTP代理或负载均衡器连接到Web服务器的客户端的原始IP地址的事实标准。

然后您可以通过Request.Headers属性访问。

但是发现这个(或另一个)标头是否可用并不是我们可以帮助的 - 您需要与为您的组织配置负载均衡器的人员交谈。

答案 1 :(得分:3)

参考@Damien_The_Unbeliever' answer,这是完整的解决方案:

public static string GetIpAddress()
{
  var request = HttpContext.Current.Request;
  // Look for a proxy address first
  var ip = request.ServerVariables["HTTP_X_FORWARDED_FOR"];

  // If there is no proxy, get the standard remote address
  if (string.IsNullOrWhiteSpace(ip)
      || string.Equals(ip, "unknown", StringComparison.OrdinalIgnoreCase))
    ip = request.ServerVariables["REMOTE_ADDR"];
  else
  {
    //extract first IP
    var index = ip.IndexOf(',');
    if (index > 0)
      ip = ip.Substring(0, index);

    //remove port
    index = ip.IndexOf(':');
    if (index > 0)
      ip = ip.Substring(0, index);
  }

  return ip;
}

答案 2 :(得分:3)

使用此代码检查生产环境......它对我有用:

    System.Web.HttpRequest oRequest = System.Web.HttpContext.Current.Request;

    string header;
    string ip;

    header = "HTTP_X_FORWARDED_FOR";
    ip = oRequest.ServerVariables[header];
    Response.Write(string.Format("{0} - {1}", header, ip) + Environment.NewLine);

    header = "REMOTE_ADDR";
    ip = oRequest.ServerVariables[header];
    Response.Write(string.Format("{0} - {1}", header, ip) + Environment.NewLine);

    header = "HTTP_CLIENT_IP";
    ip = oRequest.ServerVariables[header];
    Response.Write(string.Format("{0} - {1}", header, ip) + Environment.NewLine);

    header = "Request.UserHostAddress";
    ip = oRequest.UserHostAddress;
    Response.Write(string.Format("{0} - {1}", header, ip) + Environment.NewLine);