9

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

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

我想了解的是这个。使用 Request.UserHostAddress 捕获用户的 IP 地址是我错了,还是我们的网络设置有问题或其他问题?

谢谢,

萨钦

4

3 回答 3

11

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

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

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

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

然后您将通过该Request.Headers属性访问。

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

于 2013-03-08T15:41:48.760 回答
7

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

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;
}
于 2015-04-20T22:12:52.560 回答
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);
于 2017-03-09T19:52:23.683 回答