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