如何在asp.net中使用C#获取IP地址

如何在asp.net中使用C#获取IP地址,c#,asp.net,ip,C#,Asp.net,Ip,我想在我的代码中获取访问者的公共IP地址 我已经编写了以下代码来获得它: var context = System.Web.HttpContext.Current; string ip = String.Empty; if (context.Request.ServerVariables["HTTP_X_FORWARDED_FOR"] != null) { ip = context.Request.Serv

我想在我的代码中获取访问者的公共IP地址

我已经编写了以下代码来获得它:

        var context = System.Web.HttpContext.Current;
        string ip = String.Empty;

        if (context.Request.ServerVariables["HTTP_X_FORWARDED_FOR"] != null)
        {
            ip = context.Request.ServerVariables["HTTP_X_FORWARDED_FOR"].ToString();
        }
        else if (!String.IsNullOrWhiteSpace(context.Request.UserHostAddress))
        {
            ip = context.Request.UserHostAddress;                
        }

        if (ip == "::1")
            ip = "127.0.0.1";

        return ip;

我没有得到确切的IP地址,它会返回如下值:
fe80::9419:dfb3:22ce:4e88%68
但是当我在什么是我的IP中看到我的IP时?它显示
13.67.58.30
。如何获取确切的IP地址?

要获取请求的客户端IP,您可以使用以下方法读取:

 var clientIp = Request.ServerVariables["HTTP_X_FORWARDED_FOR"] ??
                Request.ServerVariables["REMOTE_ADDR"];
您看到的ip地址是IPv6地址,因此它们是有效的ip号码,由客户端发送HTTP头,因此对此您无能为力,这是错误的

您需要记住的一点是,HTTP_X_FORWARDED_FOR可以包含多个有效的IP号码

var listIp = Request.ServerVariables["HTTP_X_FORWARDED_FOR"];

clientIp = string.IsNullOrEmpty(listIp) ? Request.ServerVariables["REMOTE_ADDR"]
                                        : listIp.Split(',')[0];

我建议使用
Request.ServerVariables[“HTTP\u X\u FORWARDED\u FOR”]
来抵制。原因是它被
X-Forwarded-For
HTTP头传递,所有HTTP头都可以欺骗。如果使用您的代码,用户可以通过简单地替换头来模拟他们想要的任何IP。而且,不能保证所有代理都会将该头放在第一位

您可以通过以下方式获取用户的IP地址:

string ip = context.Request.UserHostAddress;

您看到的数字很可能是客户端的地址。

用户主机地址。此方法获取当前请求的IP地址。它使用ASP.NET framework中的UserHostAddress属性。这是获取IP地址的字符串表示形式的最简单方法。 例子。首先,此示例代码展示了应用程序_BeginRequest方法,该方法在用户每次访问网站时执行。您可以通过“添加->全局应用程序类”来添加它。 在应用程序_BeginRequest中,我们获取当前的HttpRequest,然后访问UserHostAddress字符串属性。最后,我们将字符串值写入输出并完成请求。 获取IP地址的方法:ASP.NET,C#

申请结果

127.0.0.1

IP地址。在本例中,我在本地主机服务器上运行了该程序,该服务器在我的计算机上。在本例中,连接只是本地连接,这意味着我的本地地址是返回的IP地址。 注: 如果此代码在远程服务器上运行,则会返回internet连接的IP地址

总结。我们使用UserHostAddress属性获取了用户的当前IP地址。此方法返回一个由句点分隔的数字组成的字符串。如果您需要通过IP记录用户或特殊情况用户,则可以直接在字典中使用此选项。


<%@ Page Language="C#" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">
<head>
   <title>User's IP Address using ASP.NET</title>
    <script language="C#" runat="server">
        public void Page_Load(Object sender, EventArgs e)
        {
            //Print the time when the page loaded initially
            Response.Write("<span class='logo' />The Page Loaded at: " + DateTime.Now.ToLongTimeString());
            divLANIPAddress.InnerHtml = GetLanIPAddress().Replace("::ffff:","");
        }
        /*
         Method to get the IP Address of the User
         */
        public String GetLanIPAddress()
        {
            //The X-Forwarded-For (XFF) HTTP header field is a de facto standard for identifying the originating IP address of a 
            //client connecting to a web server through an HTTP proxy or load balancer
            String ip = HttpContext.Current.Request.ServerVariables["HTTP_X_FORWARDED_FOR"];

            if (string.IsNullOrEmpty(ip))
            {
                ip = HttpContext.Current.Request.ServerVariables["REMOTE_ADDR"];
            }

            return ip;
        }
    </script>
    <style type="text/css">
    body
    {
      background-color:#32373a;
      color:#FFFFFF;
    }
    #mainBody
    {
      background-color:#FFFFFF;
      height:100%;
      color:#32373a;
    }
    .divMainTime
    {
      width:350px;
      height:30px;
      background-color:#fdd136;
      font-size:14px;
      vertical-align:middle;
      padding-top: 5px;
    }
    #divLANIPAddress
    {
        font-size:20px;
        float:right;
        margin-right:10px;
    }
    </style>
</head>
<body>
    <form id="form1" runat="server">

    <div id='mainBody'>
    <h1>
    Retrieve User's IP Address
    </h1>
    <br />
        <div class='divMainTime'>
            <div style='float:left;font-size:18px;'>User's IP Address :</div> 
            <div id="divLANIPAddress" runat="server"></div>
        </div>
    </div>
    </form>
</body>
</html>
使用ASP.NET的用户IP地址 公共无效页面加载(对象发送方,事件参数e) { //打印最初加载页面的时间 Write(“在以下位置加载的页面:”+DateTime.Now.ToLongTimeString()); divLANIPAddress.InnerHtml=GetLanIPAddress().Replace(“::ffff:”,”); } /* 方法获取用户的IP地址 */ 公共字符串GetLanIPAddress() { //X-Forwarded-For(XFF)HTTP头字段是一个事实上的标准,用于标识网络的原始IP地址 //通过HTTP代理或负载平衡器连接到web服务器的客户端 字符串ip=HttpContext.Current.Request.ServerVariables[“HTTP_X_FORWARDED_FOR”]; if(string.IsNullOrEmpty(ip)) { ip=HttpContext.Current.Request.ServerVariables[“REMOTE_ADDR”]; } 返回ip; } 身体 { 背景色:#32373a; 颜色:#FFFFFF; } #主体 { 背景色:#FFFFFF; 身高:100%; 颜色:#32373a; } .divMainTime { 宽度:350px; 高度:30px; 背景色:#fdd136; 字体大小:14px; 垂直对齐:中间对齐; 垫面:5px; } #divLANIPAddress { 字体大小:20px; 浮动:对; 右边距:10px; } 检索用户的IP地址
用户的IP地址:
您试图通过此代码获得的是您自己的IP,无论如何,这是一个老问题,请看一看

对我来说,最好的回应来自以下方面,但可以通过以下方式增强回应:

    protected string GetIPAddress()
    {
        var context = HttpContext.Current;
        var ip = context.Request.ServerVariables["REMOTE_ADDR"];

        if (IsInternal(ip)) {
            string ipAddress = context.Request.ServerVariables["HTTP_X_FORWARDED_FOR"];
            if (!string.IsNullOrEmpty(ipAddress))
                ip = ipAddress.Split(',')[0];
        }

        return ip;
    }

    /* An IP should be considered as internal when:

       ::1          -   IPv6  loopback
       10.0.0.0     -   10.255.255.255  (10/8 prefix)
       127.0.0.0    -   127.255.255.255  (127/8 prefix)
       172.16.0.0   -   172.31.255.255  (172.16/12 prefix)
       192.168.0.0  -   192.168.255.255 (192.168/16 prefix)
     */
    public bool IsInternal(string testIp)
    {
        if(testIp == "::1") return true;

        byte[] ip = IPAddress.Parse(testIp).GetAddressBytes();
        switch (ip[0])
        {
            case 10:
            case 127:
                return true;
            case 172:
                return ip[1] >= 16 && ip[1] < 32;
            case 192:
                return ip[1] == 168;
            default:
                return false;
        }
    }
受保护的字符串GetIPAddress()
{
var context=HttpContext.Current;
var ip=context.Request.ServerVariables[“REMOTE_ADDR”];
如果(IsInternal(ip)){
字符串ipAddress=context.Request.ServerVariables[“HTTP_X_FORWARDED_FOR”];
如果(!string.IsNullOrEmpty(ipAddress))
ip=ipAddress.Split(',')[0];
}
返回ip;
}
/*在以下情况下,IP应被视为内部IP:
::1-IPv6环回
10.0.0.0-10.255.255.255(10/8前缀)
127.0.0.0-127.255.255.255(127/8前缀)
172.16.0.0-172.31.255.255(172.16/12前缀)
192.168.0.0-192.168.255.255(192.168/16前缀)
*/
公共布尔IsInternal(字符串测试)
{
if(testIp==“::1”)返回true;
byte[]ip=IPAddress.Parse(testIp.GetAddressBytes();
交换机(ip[0])
{
案例10:
案例127:
返回true;
案例172:
返回ip[1]>=16&&ip[1]<32;
案例192:
返回ip[1]==168;
违约:
返回false;
}
}

在开发环境中,Ip将显示为这样,难道不可能在开发环境中获得Ip吗?如何测试该功能?如果您使用的是visual studio,则可以使用远程调试程序进行调试。您可以获得IP地址,如下所示。试试这个答案。运气不好。获取相同的值。我需要准确的IP地址,基于此,我必须执行更多操作。但当我使用
    protected string GetIPAddress()
    {
        var context = HttpContext.Current;
        var ip = context.Request.ServerVariables["REMOTE_ADDR"];

        if (IsInternal(ip)) {
            string ipAddress = context.Request.ServerVariables["HTTP_X_FORWARDED_FOR"];
            if (!string.IsNullOrEmpty(ipAddress))
                ip = ipAddress.Split(',')[0];
        }

        return ip;
    }

    /* An IP should be considered as internal when:

       ::1          -   IPv6  loopback
       10.0.0.0     -   10.255.255.255  (10/8 prefix)
       127.0.0.0    -   127.255.255.255  (127/8 prefix)
       172.16.0.0   -   172.31.255.255  (172.16/12 prefix)
       192.168.0.0  -   192.168.255.255 (192.168/16 prefix)
     */
    public bool IsInternal(string testIp)
    {
        if(testIp == "::1") return true;

        byte[] ip = IPAddress.Parse(testIp).GetAddressBytes();
        switch (ip[0])
        {
            case 10:
            case 127:
                return true;
            case 172:
                return ip[1] >= 16 && ip[1] < 32;
            case 192:
                return ip[1] == 168;
            default:
                return false;
        }
    }