In ASP.NET gibt es eine System.Web.HttpRequest
Klasse, die eine ServerVariables
Eigenschaft enthält, die uns die IP-Adresse aus dem REMOTE_ADDR
Eigenschaftswert bereitstellen kann .
Ich konnte jedoch keinen ähnlichen Weg finden, um die IP-Adresse des Remote-Hosts von der ASP.NET-Web-API abzurufen.
Wie kann ich die IP-Adresse des Remote-Hosts abrufen, der die Anforderung stellt?
c#
asp.net-web-api
paulius_l
quelle
quelle
RemoteEndpointMessageProperty
Klasse imSystem.ServiceModel.Channels
Namespace,System.ServiceModel.dll
Assembly? Ist das nicht eine Versammlung von WCF?Diese Lösung deckt auch die mit Owin selbst gehostete Web-API ab. Teilweise von hier .
Sie können in sich eine private Methode erstellen
ApiController
, die die Remote-IP-Adresse zurückgibt, unabhängig davon, wie Sie Ihre Web-API hosten:Referenzen erforderlich:
HttpContextWrapper
- System.Web.dllRemoteEndpointMessageProperty
- System.ServiceModel.dllOwinContext
- Microsoft.Owin.dll (Sie haben es bereits, wenn Sie das Owin-Paket verwenden)Ein kleines Problem bei dieser Lösung ist, dass Sie Bibliotheken für alle drei Fälle laden müssen, wenn Sie zur Laufzeit tatsächlich nur eine davon verwenden. Wie hier vorgeschlagen , kann dies durch Verwendung von
dynamic
Variablen überwunden werden . Sie können dieGetClientIpAddress
Methode auch als Erweiterung für schreibenHttpRequestMethod
.Jetzt können Sie es so verwenden:
quelle
using System.Net.Http;
Linie, weil Sie verlängernHttpRequestMessage
. Es sei denn, Sie definieren Ihre Erweiterung imSystem.Net.Http
Namespace, was sehr fragwürdig ist. Ich bin mir jedoch nicht sicher, ob dies unbedingt erforderlich ist, da es von jeder IDE oder jedem Produktivitätswerkzeug automatisch hinzugefügt wird. Was denken Sie?Wenn Sie wirklich einen Einzeiler möchten und nicht vorhaben, die Web-API selbst zu hosten:
quelle
Die obigen Antworten erfordern einen Verweis auf System.Web, um die Eigenschaft in HttpContext oder HttpContextWrapper umwandeln zu können. Wenn Sie die Referenz nicht möchten, können Sie die IP mithilfe einer Dynamik abrufen:
quelle
Die von carlosfigueira bereitgestellte Lösung funktioniert, aber typsichere Einzeiler sind besser: Fügen Sie Ihrer Aktionsmethode einen
using System.Web
Zugriff hinzuHttpContext.Current.Request.UserHostAddress
.quelle
HttpContext.Current
es in der gesamten Task-Pipeline nicht korrekt beibehalten wird. da die gesamte Anforderungsbehandlung asynchron ist.HttpContext.Current
sollte beim Schreiben von Web-API-Code fast immer vermieden werden.SynchronizationContext
zwischen den Aufgaben korrekt fließt); Das größte Problem dabei ist, ob Ihr Service-Code wahrscheinlich jemals selbst gehostet wird (z. B. Testen) -HttpContext.Current
ist ein reines Asp.Net-Konstrukt und existiert nicht, wenn Sie sich selbst hosten.NullReferenceException
löst ein schwer zu debuggendes Element aus, wenn er von einem Thread (z. B. einem Task-Wartenden, der im modernen Web-API-Code sehr häufig verwendet wird) oder in einem selbst gehosteten Kontext verwendet wird. Zumindest die meisten anderen Antworten werden einfach zurückkehrennull
.