Récupère l’adresse IP de l’hôte distant

Dans ASP.NET, il existe une classe System.Web.HttpRequest qui contient la propriété ServerVariables qui peut nous fournir l’adresse IP de la valeur de la propriété REMOTE_ADDR .

Cependant, je n’ai pas pu trouver une méthode similaire pour obtenir l’adresse IP de l’hôte distant à partir de l’API Web ASP.NET.

Comment puis-je obtenir l’adresse IP de l’hôte distant qui effectue la demande?

Il est possible de le faire, mais ce n’est pas très détectable: vous devez utiliser le sac de propriétés de la demande entrante et la propriété à laquelle vous devez accéder dépend de l’utilisation de l’API Web sous IIS (hébergé sur le Web) ou auto-hébergé. Le code ci-dessous montre comment cela peut être fait.

 private ssortingng GetClientIp(HttpRequestMessage request) { if (request.Properties.ContainsKey("MS_HttpContext")) { return ((HttpContextWrapper)request.Properties["MS_HttpContext"]).Request.UserHostAddress; } if (request.Properties.ContainsKey(RemoteEndpointMessageProperty.Name)) { RemoteEndpointMessageProperty prop; prop = (RemoteEndpointMessageProperty)request.Properties[RemoteEndpointMessageProperty.Name]; return prop.Address; } return null; } 

Cette solution couvre également les API Web auto-hébergées avec Owin. Partiellement d’ ici

Vous pouvez créer une méthode privée dans ApiController qui renverra une adresse IP distante, ApiController que soit l’ ApiController votre API Web:

  private const ssortingng HttpContext = "MS_HttpContext"; private const ssortingng RemoteEndpointMessage = "System.ServiceModel.Channels.RemoteEndpointMessageProperty"; private const ssortingng OwinContext = "MS_OwinContext"; private ssortingng GetClientIp(HttpRequestMessage request) { // Web-hosting if (request.Properties.ContainsKey(HttpContext )) { HttpContextWrapper ctx = (HttpContextWrapper)request.Properties[HttpContext]; if (ctx != null) { return ctx.Request.UserHostAddress; } } // Self-hosting if (request.Properties.ContainsKey(RemoteEndpointMessage)) { RemoteEndpointMessageProperty remoteEndpoint = (RemoteEndpointMessageProperty)request.Properties[RemoteEndpointMessage]; if (remoteEndpoint != null) { return remoteEndpoint.Address; } } // Self-hosting using Owin if (request.Properties.ContainsKey(OwinContext)) { OwinContext owinContext = (OwinContext)request.Properties[OwinContext]; if (owinContext != null) { return owinContext.Request.RemoteIpAddress; } } return null; } 

Références requirejses:

  • HttpContextWrapper – System.Web.dll
  • RemoteEndpointMessageProperty – System.ServiceModel.dll
  • OwinContext – Microsoft.Owin.dll (vous l’aurez déjà si vous utilisez le package Owin)

Un petit problème avec cette solution est que vous devez charger des bibliothèques pour les 3 cas où vous en utiliserez un seul pendant l’exécution. Comme suggéré ici , cela peut être surmonté en utilisant dynamic variables dynamic . Vous pouvez également écrire la méthode GetClientIpAddress en tant qu’extension pour HttpRequestMethod .

 using System.Net.Http; public static class HttpRequestMessageExtensions { private const ssortingng HttpContext = "MS_HttpContext"; private const ssortingng RemoteEndpointMessage = "System.ServiceModel.Channels.RemoteEndpointMessageProperty"; private const ssortingng OwinContext = "MS_OwinContext"; public static ssortingng GetClientIpAddress(this HttpRequestMessage request) { // Web-hosting. Needs reference to System.Web.dll if (request.Properties.ContainsKey(HttpContext)) { dynamic ctx = request.Properties[HttpContext]; if (ctx != null) { return ctx.Request.UserHostAddress; } } // Self-hosting. Needs reference to System.ServiceModel.dll. if (request.Properties.ContainsKey(RemoteEndpointMessage)) { dynamic remoteEndpoint = request.Properties[RemoteEndpointMessage]; if (remoteEndpoint != null) { return remoteEndpoint.Address; } } // Self-hosting using Owin. Needs reference to Microsoft.Owin.dll. if (request.Properties.ContainsKey(OwinContext)) { dynamic owinContext = request.Properties[OwinContext]; if (owinContext != null) { return owinContext.Request.RemoteIpAddress; } } return null; } } 

Maintenant, vous pouvez l’utiliser comme ceci:

 public class TestController : ApiController { [HttpPost] [ActionName("TestRemoteIp")] public ssortingng TestRemoteIp() { return Request.GetClientIpAddress(); } } 

Si vous voulez vraiment une seule page et ne prévoyez pas d’auto-héberger l’API Web:

 ((System.Web.HttpContextWrapper)Request.Properties["MS_HttpContext"]).Request.UserHostAddress; 

Les réponses ci-dessus nécessitent une référence à System.Web pour pouvoir convertir la propriété en HttpContext ou HttpContextWrapper. Si vous ne voulez pas la référence, vous pouvez obtenir l’IP en utilisant une dynamic:

 var host = ((dynamic)request.Properties["MS_HttpContext"]).Request.UserHostAddress; 

La solution fournie par carlosfigueira fonctionne, mais les guillemets simples de type protégé sont meilleurs: ajoutez un HttpContext.Current.Request.UserHostAddress à l’ using System.Web puis accédez à HttpContext.Current.Request.UserHostAddress dans votre méthode d’action.