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.