Sac*_*nth 6 c# load-balancing request
我的网站中有一个关键的代码行,它在我们的开发环境中工作,但不适用于生产.好吧,我说它在开发中有效但事实是它给出了::1
,这是IPv6环回地址.
无论如何,我想要做的是捕获访问该站点的用户的IP地址.因此,我曾经Request.UserHostAddress
这样做过.在开发方面,正如我所说,它给了我回送地址,这是正确的,因为我从我的机器运行该站点.在现场它做了一些完全不同的事情.它总是返回负载均衡器的地址.
我想要了解的是这一点.使用Request.UserHostAddress来捕获用户的IP地址或者我们的网络设置有什么问题或者其他什么我错了吗?
谢谢,
萨钦
在您自己的应用程序中,如果没有其他任何方法可以帮助您,那么您就会陷入困境.这是您可以获得的尽可能多的信息.
如果您很幸运,您的负载均衡器已配置为添加一个或多个额外标头,其中包含有关原始请求的信息.
一个常见的解决方案是X-Forwarded-For
标题:
X-Forwarded-For(XFF)HTTP头字段是用于识别通过HTTP代理或负载平衡器连接到Web服务器的客户端的原始IP地址的事实标准.
然后您将通过Request.Headers
酒店进入.
但是,发现这个(或另一个)标头是否可用并不是我们可以帮助的 - 您需要与为您的组织配置负载均衡器的人员交谈.
参考@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;
}
Run Code Online (Sandbox Code Playgroud)