2010-04-12 19 views

cevap

20

HttpContext.Current.Request.UserHostAddress;

veya

HttpContext.Current.Request.ServerVariables["REMOTE_ADDR"];

veya

HttpContext.Current.Request.ServerVariables["HTTP_X_FORWARDED_FOR"];

+3

farklılık nedir .. Bu kullanıcının dış ip adresini almak için deneyin İlk iki alternatif arasında ence? –

2

Request.UserHostAddress

25

Düzeltme: IP ile ilgili http header here ile ilgili ilginç bir soru da buldu.

Edit2: Yukarıdaki yorumlarda da belirtildiği gibi, HTTP_X_FORWARDED_FOR üstbilgisinde virgülle ayrılmış birden çok IP adresi bulunabilir. Bu durumla karşılaşmadım ama cevabım için bazı düzeltmelerin gerekli olduğunu varsayalım.

Ben IP adresini almak için bu kodu kullanın (nedense başarısız oluyor eğer IPAddress.None değer döndürür): onun boş alabileceğimiz eğer

/// <summary> 
    /// Gets the IP address of the request. 
    /// <remarks> 
    /// This method is more useful than built in because in some cases it may show real user IP address even under proxy. 
    /// <summary> 
    /// Gets the IP address of the request. 
    /// <remarks> 
    /// This method is more useful than built in because in some cases it may show real user IP address even under proxy. 
    /// The <see cref="System.Net.IPAddress.None" /> value will be returned if getting is failed. 
    /// </remarks> 
    /// </summary> 
    /// <param name="request">The HTTP request object.</param> 
    /// <returns></returns> 
    public static IPAddress GetIp(this HttpRequest request) 
    { 
     string ipString; 
     if (string.IsNullOrEmpty(request.ServerVariables["HTTP_X_FORWARDED_FOR"])) 
     { 
      ipString = request.ServerVariables["REMOTE_ADDR"]; 
     } 
     else 
     { 
      ipString = request.ServerVariables["HTTP_X_FORWARDED_FOR"].Split(",".ToCharArray(), StringSplitOptions.RemoveEmptyEntries) 
       .FirstOrDefault(); 
     } 

     IPAddress result; 
     if (!IPAddress.TryParse(ipString, out result)) 
     { 
      result = IPAddress.None; 
     } 

     return result; 
    } 
+7

+1 IPAddress nesnesi olarak döndürme için –

+4

'X-Forwarded-For' başlığının taklit edilebileceğini unutmayın, bu nedenle buna dayanarak herhangi bir güvenlik kararı almayın. Makine bir yük dengeleyicisinin veya ters proxy'nin arkasındaysa, sadece 'HTTP_X_FORWARDED_FOR' değerini kontrol edin. – devstuff

+2

Ayrıca, birden fazla proxy geçilirse, HTTP_X_FORWARDED_FOR'un birden fazla IP adresi içereceğini unutmayın. Parse yöntemi bunu doğru şekilde halleder mi? – Tomas

1
public String GetIP() 
{ 
    string ipString; 
    if (string.IsNullOrEmpty(Request.ServerVariables["HTTP_X_FORWARDED_FOR"])) 
    { 
     ipString = Request.ServerVariables["REMOTE_ADDR"]; 
    } 
    else 
    { 
     ipString = Request.ServerVariables["HTTP_X_FORWARDED_FOR"].Split(",".ToCharArray(), StringSplitOptions.RemoveEmptyEntries).FirstOrDefault(); 
    } 
    return ipString; 
} 

Birincisi, vekil IP bulmaya çalışıyor Bu sistem IP

0

public static string getExternalIp() 
    { 
     try 
     { 

      string externalIP; 
      externalIP = (new WebClient()).DownloadString("http://checkip.dyndns.org/"); 
      externalIP = (new Regex(@"\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}")) 
         .Matches(externalIP)[0].ToString(); 
      return externalIP; 
     } 
     catch { return null; } 
    }