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

5
我希望在我的代码中获取访问者的公共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,但当我在What is my IP?中查看我的IP时,它显示为13.67.58.30。我该如何获取准确的IP地址?


从开发环境中,IP地址将显示如下。 - Mir Gulam Sarwar
在开发环境中无法获取IP地址吗?我该如何测试功能? - Mohemmad K
如果您正在使用Visual Studio,则可以使用远程调试器进行调试。 - Zippy
你可以按照这里所示的方法获取IP地址。请尝试此答案。 点击这里 - Zia Ul Mustafa
5个回答

3
我建议不要使用Request.ServerVariables["HTTP_X_FORWARDED_FOR"]。原因是它是通过X-Forwarded-For HTTP头传递的,而所有HTTP头都可以被欺骗。如果使用你的代码,用户只需替换头部就可以冒充任何IP。此外,并不保证所有代理都会首先放置该标头。
您可以使用以下方法获取用户的IP地址:
string ip = context.Request.UserHostAddress;

你看到的那个数字很可能是客户端的IPv6地址。

但是当我使用"What is my IP"进行检查时,它会显示出正确的IP地址,例如:123.123.123.123。我不能获取那个吗? - Mohemmad K
1
context.Request.UserHostAddress 只会返回您的内部IP地址,这意味着您总是会得到类似10.xx.xx.xx的IP地址。对于大多数情况下,开发人员更倾向于获取公共IP而不是内部IP。 - Franva

3
UserHostAddress. 该方法获取当前请求的IP地址。它使用ASP.NET框架中的UserHostAddress属性。这是获取IP地址字符串表示形式的最简单方法。 示例。首先,此示例代码呈现Application_BeginRequest方法,每当用户访问网站时都会执行该方法。您可以通过转到添加 ->全局应用程序类来添加它。 在Application_BeginRequest中,我们获取当前的HttpRequest,然后访问UserHostAddress字符串属性。最后,我们将字符串值写入输出并完成请求。 获取IP地址的方法:ASP.NET,C#
using System;
using System.Web;

namespace WebApplication1
{
    public class Global : HttpApplication
    {
    protected void Application_BeginRequest(object sender,
        EventArgs e)
    {
        // Get request.
        HttpRequest request = base.Request;

        // Get UserHostAddress property.
        string address = request.UserHostAddress;

        // Write to response.
        base.Response.Write(address);

        // Done.
        base.CompleteRequest();
    }
    }
}

应用程序结果

127.0.0.1

这是IP地址。在本例中,我在本地主机上运行了该程序,也就是在自己的电脑上运行了该程序。在这种情况下,连接只是一个本地连接,这意味着我的本地地址就是所返回的IP地址。 注意: 如果在远程服务器上运行此代码,将返回我的互联网连接的IP地址。

总结。我们使用UserHostAddress属性获取了用户的当前IP地址。该方法返回以句点分隔的数字字符串。如果需要通过IP记录或特别处理用户,则可以直接将其用于字典中。


2
您尝试使用此代码获取自己的IP地址,但这是一个旧问题,请查看这里。对我来说,最好的回答来自mangokun,但可以通过以下方式进行增强:
    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;
        }
    }

1
为了获取请求客户端的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];

没有运气。得到相同的值。 - Mohemmad K
我需要准确的IP地址,因为基于此我需要执行更多的操作。 - Mohemmad K

0
<%@ 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>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接