En ASP.NET hay una System.Web.HttpRequestclase, que contiene una ServerVariablespropiedad que nos puede proporcionar la dirección IP del REMOTE_ADDRvalor 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

RemoteEndpointMessagePropertyclase en elSystem.ServiceModel.Channelsespacio de nombres,System.ServiceModel.dllensamblaje? ¿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
ApiControllerque 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
dynamicvariables. También puede escribir elGetClientIpAddressmé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.Httpespacio 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.WebaccesoHttpContext.Current.Request.UserHostAddressen su método de acción.fuente
HttpContext.Currentno se persiste correctamente en todo el proceso de tareas; ya que todo el manejo de solicitudes es asíncrono.HttpContext.Currentcasi siempre debe evitarse al escribir código de API web.SynchronizationContextfluye correctamente entre tareas); El mayor problema con esto es si es probable que su código de servicio seaHttpContext.Currentautohospedado (prueba, por ejemplo): es una construcción puramente Asp.Net y no existe cuando se autohospeda.NullReferenceExceptionsolució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.