Asp Net Web API 2.1 obtém o endereço IP do cliente

Ola eu preciso pegar o IP do cliente que solicite algum metodo na web api, tentei usar esse codigo daqui mas ele sempre retorna IP local do servidor, como entrar no caminho correto?

HttpContext.Current.Request.UserHostAddress; 

de outras perguntas:

 public static class HttpRequestMessageExtensions { private const string HttpContext = "MS_HttpContext"; private const string RemoteEndpointMessage = "System.ServiceModel.Channels.RemoteEndpointMessageProperty"; public static string GetClientIpAddress(this HttpRequestMessage request) { if (request.Properties.ContainsKey(HttpContext)) { dynamic ctx = request.Properties[HttpContext]; if (ctx != null) { return ctx.Request.UserHostAddress; } } if (request.Properties.ContainsKey(RemoteEndpointMessage)) { dynamic remoteEndpoint = request.Properties[RemoteEndpointMessage]; if (remoteEndpoint != null) { return remoteEndpoint.Address; } } return null; } } 

O link a seguir pode ajudar você. Aqui está o código do link a seguir.

referência: obtendo-o-cliente-ip-via-asp-net-web-api

 using System.Net.Http; using System.ServiceModel.Channels; using System.Web; using System.Web.Http; namespace Trikks.Controllers.Api { public class IpController : ApiController { public string GetIp() { return GetClientIp(); } private string GetClientIp(HttpRequestMessage request = null) { request = request ?? Request; if (request.Properties.ContainsKey("MS_HttpContext")) { return ((HttpContextWrapper)request.Properties["MS_HttpContext"]).Request.UserHostAddress; } else if (request.Properties.ContainsKey(RemoteEndpointMessageProperty.Name)) { RemoteEndpointMessageProperty prop = (RemoteEndpointMessageProperty)request.Properties[RemoteEndpointMessageProperty.Name]; return prop.Address; } else if (HttpContext.Current != null) { return HttpContext.Current.Request.UserHostAddress; } else { return null; } } } } 

Outra maneira de fazer isso está abaixo.

referência: como-para-acessar-o-cliente-s-endereço-ip

Para a versão hospedada na web

 string clientAddress = HttpContext.Current.Request.UserHostAddress; 

Para auto hospedado

 object property; Request.Properties.TryGetValue(typeof(RemoteEndpointMessageProperty).FullName, out property); RemoteEndpointMessageProperty remoteProperty = property as RemoteEndpointMessageProperty; 

Com Web API 2.2: Request.GetOwinContext().Request.RemoteIpAddress

Tente pegar o Ip usando

 ip = HttpContext.Current != null ? HttpContext.Current.Request.UserHostAddress : ""; 

Se você for uma hospedagem própria com o Asp.Net 2.1 usando o pacote OWIN Self-host NuGet, poderá usar o seguinte código:

  private string getClientIp(HttpRequestMessage request = null) { if (request == null) { return null; } if (request.Properties.ContainsKey("MS_OwinContext")) { return ((OwinContext) request.Properties["MS_OwinContext"]).Request.RemoteIpAddress; } return null; } 

É melhor lançá-lo para o HttpContextBase , dessa forma você pode fazer um mock e testá-lo mais facilmente

 public string GetUserIp(HttpRequestMessage request) { if (request.Properties.ContainsKey("MS_HttpContext")) { var ctx = request.Properties["MS_HttpContext"] as HttpContextBase; if (ctx != null) { return ctx.Request.UserHostAddress; } } return null; } 

Acho que esta é a solução mais clara, usando um método de extensão:

 public static class HttpRequestMessageExtensions { private const string HttpContext = "MS_HttpContext"; private const string RemoteEndpointMessage = "System.ServiceModel.Channels.RemoteEndpointMessageProperty"; public static string GetClientIpAddress(this HttpRequestMessage request) { if (request.Properties.ContainsKey(HttpContext)) { dynamic ctx = request.Properties[HttpContext]; if (ctx != null) { return ctx.Request.UserHostAddress; } } if (request.Properties.ContainsKey(RemoteEndpointMessage)) { dynamic remoteEndpoint = request.Properties[RemoteEndpointMessage]; if (remoteEndpoint != null) { return remoteEndpoint.Address; } } return null; } } 

Então, basta usá-lo como:

 var ipAddress = request.GetClientIpAddress(); 

Nós usamos isso em nossos projetos.

Fonte / Referência: Recuperando o endereço IP do cliente na API da Web do ASP.NET

Minha solução é semelhante à resposta de user1587439, mas funciona diretamente na instância do controlador (em vez de acessar HttpContext.Current).

Na janela ‘Watch’, vi que this.RequestContext.WebRequest contém a propriedade ‘UserHostAddress’, mas como ele depende do tipo WebHostHttpRequestContext (que é interno ao assembly ‘System.Web.Http’) – eu não estava capaz de acessá-lo diretamente, então eu usei a reflection para acessá-lo diretamente:

string hostAddress = ((System.Web.HttpRequestWrapper)this.RequestContext.GetType().Assembly.GetType("System.Web.Http.WebHost.WebHostHttpRequestContext").GetProperty("WebRequest").GetMethod.Invoke(this.RequestContext, null)).UserHostAddress;

Não estou dizendo que é a melhor solução. usar reflection pode causar problemas no futuro em caso de atualização do framework (devido a mudanças de nome), mas para as minhas necessidades é perfeito

Respondendo a este post de 4 anos, porque isso parece muito complicado para mim, pelo menos se você estiver hospedando no IIS e este post é muito alto em DuckDuckGo (e provavelmente NSAoogle) para “web api controller obter endereço IP”.

Aqui está como eu resolvi isso:

 using System; using System.Net; using System.Web; using System.Web.Http; ... [HttpPost] [Route("ContactForm")] public IHttpActionResult PostContactForm([FromBody] ContactForm contactForm) { var hostname = HttpContext.Current.Request.UserHostAddress; IPAddress ipAddress = IPAddress.Parse(hostname); IPHostEntry ipHostEntry = Dns.GetHostEntry(ipAddress); ... 

Ao contrário do OP, isso me dá o IP do cliente e o nome do host do cliente, não o servidor. Talvez eles tenham consertado o bug desde então?