首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >在C#中获取IP地址

在C#中获取IP地址
EN

Stack Overflow用户
提问于 2014-01-15 22:20:22
回答 2查看 3.2K关注 0票数 0

我目前有一个获取客户端IP地址的RESTful C# web服务。在实现负载平衡之前,这是很好的。所以现在web服务就坐在负载均衡器后面。

现在,每次我试图获取用户的IP地址时,我都会得到负载均衡器的IP地址。代码是这样的..。

代码语言:javascript
运行
复制
System.Web.HttpContext context = System.Web.HttpContext.Current;
        if (context.Request.ServerVariables.AllKeys.Contains("HTTP_CLIENT_IP") && CheckIP(context.Request.ServerVariables["HTTP_CLIENT_IP"]))
            return new Model(context.Request.ServerVariables["HTTP_CLIENT_IP"]);

        if (context.Request.ServerVariables.AllKeys.Contains("HTTP_X_FORWARDED_FOR"))
            foreach (string ip in context.Request.ServerVariables["HTTP_X_FORWARDED_FOR"].Split(','))
                if (CheckIP(ip.Trim()))
                    return new Model(ip.Trim());

        if (context.Request.ServerVariables.AllKeys.Contains("HTTP_X_FORWARDED") && CheckIP(context.Request.ServerVariables["HTTP_X_FORWARDED"]))
            return new Model(context.Request.ServerVariables["HTTP_X_FORWARDED"]);

        if (context.Request.ServerVariables.AllKeys.Contains("HTTP_X_CLUSTER_CLIENT_IP") && CheckIP(context.Request.ServerVariables["HTTP_X_CLUSTER_CLIENT_IP"]))
            return new Model(context.Request.ServerVariables["HTTP_X_CLUSTER_CLIENT_IP"]);

        if (context.Request.ServerVariables.AllKeys.Contains("HTTP_FORWARDED_FOR") && CheckIP(context.Request.ServerVariables["HTTP_FORWARDED_FOR"]))
            return new Model(context.Request.ServerVariables["HTTP_FORWARDED_FOR"]);

        if (context.Request.ServerVariables.AllKeys.Contains("HTTP_FORWARDED") && CheckIP(context.Request.ServerVariables["HTTP_FORWARDED"]))
            return new Model(context.Request.ServerVariables["HTTP_FORWARDED"]);

        return new Model(context.Request.ServerVariables["REMOTE_ADDR"]);

尽管如此,我最终还是会得到错误的IP地址。有什么想法吗?想法?我是不是遗漏了什么?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-01-15 22:22:51

行为良好的负载均衡器应该在X报头中放置一个或多个IP地址。您的代码正在检查HTTP_FORWARDED_FOR和其他两个不太正确的变量。

并不是所有的负载平衡器都表现得很好,有些可以配置为在当前不在的情况下包含该标头。

如果有多个转发点,则报头中将有多个IP地址。在这种情况下,第一个列出的是客户机IP。

转发-For: client,proxy1,proxy2

票数 4
EN

Stack Overflow用户

发布于 2019-06-14 12:30:10

代码语言:javascript
运行
复制
        string sIpaddress = "";
        if (Request.Headers["True-Client-IP"] != null)
        {
            sIpaddress = Request.Headers["True-Client-IP"]; //if the user is behind a proxy server
        }
        if (sIpaddress == "")
        {
            if (Request.Headers["CF-CONNECTING-IP"] != null)
                sIpaddress = Request.Headers["CF-CONNECTING-IP"];
        }
        if (sIpaddress == "")
        {
            if (Request.Headers["X-Forwarded-For"] != null)
                sIpaddress = Request.Headers["X-Forwarded-For"];
        }
        if (sIpaddress == "")
        {
            if (Request.ServerVariables["REMOTE_ADDR"] != null)
                sIpaddress = Request.ServerVariables["REMOTE_ADDR"];
        }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21149493

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档