tutorial net example crear como asp c# asp.net asp.net-web-api

net - web api rest c#



Asp Net Web API 2.1 obtiene la dirección IP del cliente (8)

Hola, necesito obtener IP del cliente que solicite algún método en la API web, he intentado utilizar este código desde here pero siempre devuelve IP local del servidor, ¿cómo puedo obtenerlo de la forma 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; } }


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


Creo que esta es la solución más clara, utilizando 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 solo úsala como:

var ipAddress = request.GetClientIpAddress();

Usamos esto en nuestros proyectos.

Fuente / Referencia: here


El siguiente enlace puede ayudarte. Aquí está el código del siguiente enlace.

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

Otra forma de hacerlo es a continuación.

referencia: how-to-access-the-client-s-ip-address

Para la versión alojada en la web

string clientAddress = HttpContext.Current.Request.UserHostAddress;

Para autohospedado

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


Es mejor HttpContextBase a HttpContextBase , de esta forma puedes simular 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; }


Intenta obtener el Ip usando

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


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 dado que se basa en el tipo WebHostHttpRequestContext (que es interno al ensamblado ''System.Web.Http'') - No estaba poder acceder a él directamente, así que usé la reflexión para acceder directamente a él:

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. Usar 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


Respondiendo a esta publicación de 4 años, porque me parece demasiado complicado, al menos si estás alojando en IIS y esta publicación es muy alta en DuckDuckGo (y probablemente en NSAoogle) para que "el controlador web api obtenga la 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. Tal vez han solucionado el error desde entonces?


Si se autohospeda con Asp.Net 2.1 utilizando 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; }