Asp Net Web API 2.1 obtener la dirección IP del cliente


112

Hola, necesito obtener la IP del cliente que solicite algún método en la api web, he intentado usar este código desde aquí pero siempre devuelve la IP local del servidor, ¿cómo llegar de la manera correcta?

HttpContext.Current.Request.UserHostAddress;

de otras preguntas:

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

Este método de extensión me funciona bien. (No estoy usando OWIN ni nada inusual)
Nate Barbettini

genial reconocer la fuente. Editado
Stefano Mtangoo

Respuestas:


124

El siguiente enlace podría ayudarlo. Aquí está el código del siguiente enlace.

referencia: obtener-la-ip-del-cliente-vía-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;
                }
           }
     }
}

Otra forma de hacer esto es la siguiente.

referencia: cómo-acceder-a-la-dirección-ip-s-del-cliente

Para la versión alojada en la web

string clientAddress = HttpContext.Current.Request.UserHostAddress;

Para auto alojado

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


16

Intenta que el IP use

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

1
@DenisBabarykin Creo que debería, .. devuelve la dirección IP en la variable de servidor REMOTE_ADDR
user1587439

9

Si es autohospedado con Asp.Net 2.1 usando el paquete OWIN Self-host NuGet, puede usar el siguiente 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;
    }

7

Respondiendo a esta publicación de hace 4 años, porque me parece demasiado complicado, al menos si está alojando en IIS y esta publicación es muy alta en DuckDuckGo (y probablemente NSAoogle) para "controlador de API web obtener dirección IP".

Así es como lo resolví:

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);
        ...

A diferencia de OP, esto me da la IP del cliente y el nombre de host del cliente, no el servidor. ¿Quizás hayan solucionado el error desde entonces?


Me encantaría ver una respuesta para usar la API web DotNetCore. No puedo creer que sea tan difícil hacer algo tan rudimentario.
MC9000

5

Es mejor lanzarlo a HttpContextBase, de esta manera puedes burlarte y probarlo más fácilmente

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

1
Busqué en Google y otros parecen estar de acuerdo con esto (enviar a HttpContextBase en lugar de HttpContextWrapper porque HttpContextBase es más fácil de burlarse)
Dave Clausen

4

Creo que esta es la solución más clara, usando un método de extensión:

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

Así que utilícelo como:

var ipAddress = request.GetClientIpAddress();

Usamos esto en nuestros proyectos.

Fuente / Referencia: Recuperar la dirección IP del cliente en ASP.NET Web API


2

Mi solución es similar a la respuesta del usuario1587439, pero funciona directamente en la instancia del controlador (en lugar de acceder a HttpContext.Current).

En la ventana 'Ver', vi que this.RequestContext.WebRequest contiene la propiedad 'UserHostAddress', pero como se basa en el tipo WebHostHttpRequestContext (que es interno al ensamblado 'System.Web.Http'), no lo estaba poder acceder a él directamente, así que utilicé la reflexión para acceder directamente:

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

No digo que sea la mejor solución. el uso de la reflexión puede causar problemas en el futuro en caso de actualización del marco (debido a cambios de nombre), pero para mis necesidades es perfecto


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

Esto funciona en mi.

System.Web.HttpContext.Current.Request.UserHostName;este me devuelve el mismo retorno que obtengo del UserHostAddress.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.