Asp Net Web API 2.1 obter o endereço IP do cliente

112

Olá estou precisando pegar o IP do cliente que pede algum método na web api, já tentei usar esse código daqui mas ele sempre retorna o IP local do servidor, como conseguir de forma correta?

HttpContext.Current.Request.UserHostAddress;

de outras questões:

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;
        }
    }
Arbejdsglæde
fonte
Este método de extensão funciona bem para mim. (Não estou usando OWIN ou algo incomum.)
Nate Barbettini
ótimo reconhecer a fonte. Editado
Stefano Mtangoo,
Possível duplicata de Obtenha o endereço IP do host remoto
Michael Freidgeim

Respostas:

124

O link a seguir pode ajudá-lo. Aqui está o código do link a seguir.

referência: getting-the-client-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: how-to-access-the-client-s-ip-address

Para 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;
Jalpesh Vadgama
fonte
71

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

Ben Wilde
fonte
28
Observe que isso só funciona se você estiver usando Owin - msdn.microsoft.com/en-us/library/…
Chandramouleswaran Ravichandra
16

Tente obter o IP usando

ip = HttpContext.Current != null ? HttpContext.Current.Request.UserHostAddress : "";
user1587439
fonte
1
@DenisBabarykin eu acho que deveria, .. ele retorna o endereço IP na variável do servidor REMOTE_ADDR
user1587439
9

Se você estiver se hospedando sozinho com 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;
    }
CoryC
fonte
7

Respondendo a este post de 4 anos, porque isso me parece muito complicado, pelo menos se você estiver hospedando no IIS e este post for muito alto no DuckDuckGo (e provavelmente no NSAoogle) para "controlador de API da web obter endereço IP".

Veja como eu resolvi:

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 corrigido o bug desde então?

Scott R. Frost
fonte
Adoraria ver uma resposta para usar a API da Web do DotNetCore. Não acredito que seja tão difícil fazer algo tão rudimentar.
MC9000
5

É melhor lançar para HttpContextBase, desta forma você pode simular e testar 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;
}
Maxime Nanouche
fonte
1
Eu pesquisei e outros parecem concordar com isso (convertido para HttpContextBase em vez de HttpContextWrapper porque HttpContextBase é mais fácil de ridicularizar.)
Dave Clausen
4

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, use-o como:

var ipAddress = request.GetClientIpAddress();

Usamos isso em nossos projetos.

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

Vasil Popov
fonte
2

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

Na janela 'Watch', eu vi que this.RequestContext.WebRequest contém a propriedade 'UserHostAddress', mas como ela depende do tipo WebHostHttpRequestContext (que é interno ao assembly 'System.Web.Http') - eu não era capaz de acessá-lo diretamente, então usei reflexão 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 reflexão pode causar problemas no futuro em caso de atualização do framework (devido a mudanças de nome), mas para minhas necessidades é perfeito

Nissim
fonte
0
string userRequest = System.Web.HttpContext.Current.Request.UserHostAddress;

Isso funciona em mim.

System.Web.HttpContext.Current.Request.UserHostName;este me retorna o mesmo retorno que recebo do UserHostAddress.

Robert Tan
fonte