Como obter o endereço IP público de um usuário em c #

Eu quero o endereço IP público do cliente que está usando meu site. O código abaixo está mostrando o IP local na LAN, mas eu quero o IP público do cliente.

//get mac address NetworkInterface[] nics = NetworkInterface.GetAllNetworkInterfaces(); String sMacAddress = string.Empty; foreach (NetworkInterface adapter in nics) { if (sMacAddress == String.Empty)// only return MAC Address from first card { IPInterfaceProperties properties = adapter.GetIPProperties(); sMacAddress = adapter.GetPhysicalAddress().ToString(); } } // To Get IP Address string IPHost = Dns.GetHostName(); string IP = Dns.GetHostByName(IPHost).AddressList[0].ToString(); 

Saída:

Endereço IP: 192.168.1.7

Por favor me ajude a obter o endereço IP público.

Isso é o que eu uso:

 protected void GetUser_IP() { string VisitorsIPAddr = string.Empty; if (HttpContext.Current.Request.ServerVariables["HTTP_X_FORWARDED_FOR"] != null) { VisitorsIPAddr = HttpContext.Current.Request.ServerVariables["HTTP_X_FORWARDED_FOR"].ToString(); } else if (HttpContext.Current.Request.UserHostAddress.Length != 0) { VisitorsIPAddr = HttpContext.Current.Request.UserHostAddress; } uip.Text = "Your IP is: " + VisitorsIPAddr; } 

“uip” é o nome do label na página aspx que mostra o IP do usuário.

Você pode usar o atributo de header “HTTP_X_FORWARDED_FOR” ou “REMOTE_ADDR”.

Consulte o método GetVisitorIPAdress no blog de syntax da máquina.

  ///  /// method to get Client ip address ///  ///  set to true if want to get local(LAN) Connected ip address ///  public static string GetVisitorIPAddress(bool GetLan = false) { string visitorIPAddress = HttpContext.Current.Request.ServerVariables["HTTP_X_FORWARDED_FOR"]; if (String.IsNullOrEmpty(visitorIPAddress)) visitorIPAddress = HttpContext.Current.Request.ServerVariables["REMOTE_ADDR"]; if (string.IsNullOrEmpty(visitorIPAddress)) visitorIPAddress = HttpContext.Current.Request.UserHostAddress; if (string.IsNullOrEmpty(visitorIPAddress) || visitorIPAddress.Trim() == "::1") { GetLan = true; visitorIPAddress = string.Empty; } if (GetLan && string.IsNullOrEmpty(visitorIPAddress)) { //This is for Local(LAN) Connected ID Address string stringHostName = Dns.GetHostName(); //Get Ip Host Entry IPHostEntry ipHostEntries = Dns.GetHostEntry(stringHostName); //Get Ip Address From The Ip Host Entry Address List IPAddress[] arrIpAddress = ipHostEntries.AddressList; try { visitorIPAddress = arrIpAddress[arrIpAddress.Length - 2].ToString(); } catch { try { visitorIPAddress = arrIpAddress[0].ToString(); } catch { try { arrIpAddress = Dns.GetHostAddresses(stringHostName); visitorIPAddress = arrIpAddress[0].ToString(); } catch { visitorIPAddress = "127.0.0.1"; } } } } return visitorIPAddress; } 

Combinação de todas estas sugestões e as razões por trás delas. Sinta-se à vontade para adicionar mais casos de teste também. Se obter o IP do cliente é de suma importância, do que você pode querer obter todas as teses, execute algumas comparações sobre qual resultado pode ser mais preciso.

Verificação simples de todas as sugestões neste tópico, além de alguns dos meus próprios códigos …

  using System.IO; using System.Net; public string GetUserIP() { string strIP = String.Empty; HttpRequest httpReq = HttpContext.Current.Request; //test for non-standard proxy server designations of client's IP if (httpReq.ServerVariables["HTTP_CLIENT_IP"] != null) { strIP = httpReq.ServerVariables["HTTP_CLIENT_IP"].ToString(); } else if (httpReq.ServerVariables["HTTP_X_FORWARDED_FOR"] != null) { strIP = httpReq.ServerVariables["HTTP_X_FORWARDED_FOR"].ToString(); } //test for host address reported by the server else if ( //if exists (httpReq.UserHostAddress.Length != 0) && //and if not localhost IPV6 or localhost name ((httpReq.UserHostAddress != "::1") || (httpReq.UserHostAddress != "localhost")) ) { strIP = httpReq.UserHostAddress; } //finally, if all else fails, get the IP from a web scrape of another server else { WebRequest request = WebRequest.Create("http://checkip.dyndns.org/"); using (WebResponse response = request.GetResponse()) using (StreamReader sr = new StreamReader(response.GetResponseStream())) { strIP = sr.ReadToEnd(); } //scrape ip from the html int i1 = strIP.IndexOf("Address: ") + 9; int i2 = strIP.LastIndexOf(""); strIP = strIP.Substring(i1, i2 - i1); } return strIP; } 

Esse código leva você ao endereço IP do seu servidor e não ao endereço do cliente que está acessando o seu site. Use a propriedade HttpContext.Current.Request.UserHostAddress para o endereço IP do cliente.

Para aplicativos da Web (ASP.NET MVC e WebForm)

 ///  /// Get current user ip address. ///  /// The IP Address public static string GetUserIPAddress() { 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; } 

Para aplicativos do Windows (Formulário do Windows, Console, Serviço do Windows, …)

  static void Main(string[] args) { HTTPGet req = new HTTPGet(); req.Request("http://checkip.dyndns.org"); string[] a = req.ResponseBody.Split(':'); string a2 = a[1].Substring(1); string[] a3=a2.Split('< '); string a4 = a3[0]; Console.WriteLine(a4); Console.ReadLine(); } 

Muitos desses trechos de código são realmente grandes e podem confundir novos programadores em busca de ajuda.

Como sobre este código simples e compacto para buscar o endereço IP do visitante?

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

Simples, curto e compacto.

Eu tenho um método de extensão:

 public static string GetIp(this HttpContextBase context) { if (context == null || context.Request == null) return string.Empty; return context.Request.ServerVariables["HTTP_X_FORWARDED_FOR"] ?? context.Request.UserHostAddress; } 

Nota: “HTTP_X_FORWARDED_FOR” é para ip atrás do proxy. context.Request.UserHostAddress é idêntico a “REMOTE_ADDR”.

Mas tenha em mente que não é necessário o IP atual.

Fontes:

Variáveis ​​do servidor IIS

Ligação

Minha versão lida com o ASP.NET ou com os IPs da LAN:

 /** * Get visitor's ip address. */ public static string GetVisitorIp() { string ip = null; if (HttpContext.Current != null) { // ASP.NET ip = string.IsNullOrEmpty(HttpContext.Current.Request.ServerVariables["HTTP_X_FORWARDED_FOR"]) ? HttpContext.Current.Request.UserHostAddress : HttpContext.Current.Request.ServerVariables["HTTP_X_FORWARDED_FOR"]; } if (string.IsNullOrEmpty(ip) || ip.Trim() == "::1") { // still can't decide or is LAN var lan = Dns.GetHostEntry(Dns.GetHostName()).AddressList.FirstOrDefault(r => r.AddressFamily == AddressFamily.InterNetwork); ip = lan == null ? string.Empty : lan.ToString(); } return ip; } 
  private string GetClientIpaddress() { string ipAddress = string.Empty; ipAddress = HttpContext.Current.Request.ServerVariables["HTTP_X_FORWARDED_FOR"]; if (ipAddress == "" || ipAddress == null) { ipAddress = HttpContext.Current.Request.ServerVariables["REMOTE_ADDR"]; return ipAddress; } else { return ipAddress; } } 

No MVC 5 você pode usar isto:

 string cIpAddress = Request.UserHostAddress; //Gets the client ip address 

ou

 string cIpAddress = Request.ServerVariables["REMOTE_ADDR"]; //Gets the client ip address 

Em MVC IP pode ser obtido pelo seguinte código

 string ipAddress = Request.ServerVariables["REMOTE_ADDR"]; 
 string IP = HttpContext.Current.Request.Params["HTTP_CLIENT_IP"] ?? HttpContext.Current.Request.UserHostAddress; 

é só usar isso ………………

 public string GetIP() { 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; } 

Nos conectamos a servidores que nos fornecem nosso endereço IP externo e tentamos analisar o IP de páginas HTML retornadas. Mas quando os servidores fazem pequenas alterações nessas páginas ou as removem, esses methods param de funcionar corretamente.

Aqui está um método que leva o endereço IP externo usando um servidor que está ativo há anos e retorna uma resposta simples rapidamente … https://www.codeproject.com/Tips/452024/Getting-the-External-IP- Endereço

 Private 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; } } 

VB.NET

 Imports System.Net Private Function GetExternalIp() As String Try Dim ExternalIP As String 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 Nothing End Try 

Função final

 lblmessage.Text =Request.ServerVariables["REMOTE_HOST"].ToString();