Dans ASP.NET, il existe une System.Web.HttpRequest
classe, qui contient une ServerVariables
propriété qui peut nous fournir l'adresse IP à partir de la REMOTE_ADDR
valeur de la propriété.
Cependant, je n'ai pas pu trouver un moyen similaire d'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 fait la demande?
c#
asp.net-web-api
paulius_l
la source
la source
RemoteEndpointMessageProperty
classe est-elle dans l'System.ServiceModel.Channels
espace de noms, l'System.ServiceModel.dll
assembly? N'est-ce pas une assemblée appartenant à WCF?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 en vous
ApiController
qui retournera une adresse IP distante quelle que soit la façon dont vous hébergez votre API Web:Références requises:
HttpContextWrapper
- System.Web.dllRemoteEndpointMessageProperty
- System.ServiceModel.dllOwinContext
- 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 n'utiliserez en fait qu'une seule d'entre elles pendant l'exécution. Comme suggéré ici , cela peut être surmonté en utilisant des
dynamic
variables. Vous pouvez également écrire uneGetClientIpAddress
méthode comme extension pourHttpRequestMethod
.Vous pouvez maintenant l'utiliser comme ceci:
la source
using System.Net.Http;
ligne parce que vous étendezHttpRequestMessage
. À moins que vous ne définissiez votre extension dans l'System.Net.Http
espace de noms, ce qui est très discutable. Pas sûr que ce soit essentiel, car il sera automatiquement ajouté par n'importe quel IDE ou outil de productivité. Qu'est-ce que tu penses?Si vous voulez vraiment un one-liner et ne prévoyez pas d'auto-héberger l'API Web:
la source
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 dynamique:
la source
La solution fournie par carlosfigueira fonctionne, mais les one-liners de type sécurisé sont meilleurs: ajoutez un
using System.Web
accès puisHttpContext.Current.Request.UserHostAddress
dans votre méthode d'action.la source
HttpContext.Current
n'est pas conservé correctement tout au long du pipeline de tâches; puisque toute la gestion des demandes est asynchrone.HttpContext.Current
doit presque toujours être évité lors de l'écriture de code API Web.SynchronizationContext
flux est correctement effectué entre les tâches); le plus gros problème avec cela est si votre code de service est susceptible d'être auto-hébergé (test, par exemple) -HttpContext.Current
est une construction purement Asp.Net et n'existe pas lorsque vous vous auto-hébergez.NullReferenceException
problème difficile à déboguer s'il est utilisé à partir d'un thread (par exemple, un serveur de tâches, très courant dans le code API Web moderne) ou dans un contexte auto-hébergé. Au moins la plupart des autres réponses reviendrontnull
.