2016-02-02 39 views
1

我想在代碼中獲取訪問者的公共IP地址。如何在asp.net中使用C#獲取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地址?

+0

從開發環境IP將表明這樣 –

+0

是不是可以獲取IP的開發環境?我將如何測試功能? –

+0

如果您使用的是Visual Studio,您可以使用遠程調試器進行調試 – Zippy

回答

0

使用GET請求的客戶端IP才能閱讀:你看到的是IPv6地址,所以它們是有效的IP號碼,以

var clientIp = Request.ServerVariables["HTTP_X_FORWARDED_FOR"] ?? 
       Request.ServerVariables["REMOTE_ADDR"]; 

的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]; 
+0

沒有那個運氣。獲得相同的價值。 –

+0

我想要確切的IP地址作爲基礎,我必須執行更多的操作。 –

1

我會用Request.ServerVariables["HTTP_X_FORWARDED_FOR"]建議。原因是它正通過X-Forwarded-For HTTP標頭傳遞,並且所有HTTP標頭可能是欺騙。如果使用您的代碼,用戶可以通過簡單地替換標題來模擬他們想要的任何IP。另外,並不能保證所有的代理服務器都會將首標放在首位。

您可以通過獲取用戶的IP地址:

string ip = context.Request.UserHostAddress; 

這個數字你看到的很可能是客戶端的IPv6地址。

+0

但是,當我檢查使用什麼是我的IP然後它顯示我正確的IP地址。例如,123.123.123.123。我不能得到那一個? 。 –

+0

context.Request.UerHostAddress只返回你的內部IP,這意味着你總是得到一個類似於10.xx.xx.xx的IP。對於大多數情況,開發者希望獲得公共IP而不是內部IP。 – Franva

1

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地址。在這個例子中,我在localhost服務器上運行了程序,這是我的電腦上的一個。在這種情況下,連接只是本地連接,這意味着我的本地地址是返回的IP地址。 注意: 如果此代碼在遠程服務器上運行,則會返回我的Internet連接的IP地址。

總結。我們通過UserHostAddress屬性獲取了用戶的當前IP地址。此方法返回一個字符串,其中的數字由句點分隔。如果您需要通過IP記錄或特殊用戶,則可以直接在字典中使用該字段。

+0

至少可以鏈接原始文章... http://www.dotnetperls.com/ip –

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

什麼你試圖讓這個代碼是你自己的IP,反正這是一個老問題,請看一看here

對我來說,最好的迴應是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; 
     } 
    }