En ASP.NET hay una System.Web.HttpRequest
clase, que contiene una ServerVariables
propiedad que nos puede proporcionar la dirección IP del REMOTE_ADDR
valor de la propiedad.
Sin embargo, no pude encontrar una forma similar de obtener la dirección IP del host remoto de la API web de ASP.NET.
¿Cómo puedo obtener la dirección IP del host remoto que realiza la solicitud?
c#
asp.net-web-api
paulius_l
fuente
fuente
RemoteEndpointMessageProperty
clase en elSystem.ServiceModel.Channels
espacio de nombres,System.ServiceModel.dll
ensamblaje? ¿No es una asamblea perteneciente a WCF?Esta solución también cubre la API web autohospedada usando Owin. Parcialmente desde aquí .
Puede crear un método privado en usted
ApiController
que devolverá la dirección IP remota sin importar cómo aloje su API web:Referencias requeridas:
HttpContextWrapper
- System.Web.dllRemoteEndpointMessageProperty
- System.ServiceModel.dllOwinContext
- Microsoft.Owin.dll (ya lo tendrá si usa el paquete Owin)Un pequeño problema con esta solución es que debe cargar bibliotecas para los 3 casos en los que realmente usará solo uno de ellos durante el tiempo de ejecución. Como se sugiere aquí , esto se puede superar mediante el uso de
dynamic
variables. También puede escribir elGetClientIpAddress
método como una extensión paraHttpRequestMethod
.Ahora puedes usarlo así:
fuente
using System.Net.Http;
línea porque estás extendiendoHttpRequestMessage
. A menos que esté definiendo su extensión en elSystem.Net.Http
espacio de nombres que es muy cuestionable. Sin embargo, no estoy seguro de que sea esencial, ya que cualquier herramienta IDE o de productividad la agregará automáticamente. ¿Qué piensas?Si realmente desea una línea única y no planea auto-hospedar API web:
fuente
Las respuestas anteriores requieren una referencia a System.Web para poder convertir la propiedad a HttpContext o HttpContextWrapper. Si no desea la referencia, puede obtener la ip utilizando una dinámica:
fuente
La solución proporcionada por carlosfigueira funciona, pero las frases sencillas de tipo seguro son mejores: agregue un
using System.Web
accesoHttpContext.Current.Request.UserHostAddress
en su método de acción.fuente
HttpContext.Current
no se persiste correctamente en todo el proceso de tareas; ya que todo el manejo de solicitudes es asíncrono.HttpContext.Current
casi siempre debe evitarse al escribir código de API web.SynchronizationContext
fluye correctamente entre tareas); El mayor problema con esto es si es probable que su código de servicio seaHttpContext.Current
autohospedado (prueba, por ejemplo): es una construcción puramente Asp.Net y no existe cuando se autohospeda.NullReferenceException
solución difícil de depurar si se usa desde un hilo (por ejemplo, un administrador de tareas, muy común en el código moderno de API web) o en un contexto autohospedado. Al menos la mayoría de las otras respuestas simplemente regresaránnull
.