Asp Net Web API 2.1 erhält die Client-IP-Adresse

112

Hallo, ich brauche eine Client-IP, die eine Methode in der Web-API anfordert. Ich habe versucht, diesen Code von hier aus zu verwenden , aber er gibt immer die lokale Server-IP zurück. Wie komme ich richtig?

HttpContext.Current.Request.UserHostAddress;

von anderen Fragen:

public static class HttpRequestMessageExtensions
    {
        private const string HttpContext = "MS_HttpContext";
        private const string RemoteEndpointMessage = "System.ServiceModel.Channels.RemoteEndpointMessageProperty";

        public static string GetClientIpAddress(this HttpRequestMessage request)
        {
            if (request.Properties.ContainsKey(HttpContext))
            {
                dynamic ctx = request.Properties[HttpContext];
                if (ctx != null)
                {
                    return ctx.Request.UserHostAddress;
                }
            }

            if (request.Properties.ContainsKey(RemoteEndpointMessage))
            {
                dynamic remoteEndpoint = request.Properties[RemoteEndpointMessage];
                if (remoteEndpoint != null)
                {
                    return remoteEndpoint.Address;
                }
            }

            return null;
        }
    }
Arbejdsglæde
quelle
Diese Erweiterungsmethode funktioniert gut für mich. (Ich benutze nicht OWIN oder etwas Ungewöhnliches.)
Nate Barbettini
großartig, Quelle anzuerkennen. Bearbeitet
Stefano Mtangoo
Mögliches Duplikat von Holen Sie sich die IP-Adresse des Remote-Hosts
Michael Freidgeim

Antworten:

124

Der folgende Link könnte Ihnen helfen. Hier ist Code vom folgenden Link.

Referenz: Holen Sie sich die Client-IP über Asp-Net-Web-API

using System.Net.Http;
using System.ServiceModel.Channels;
using System.Web;
using System.Web.Http;


namespace Trikks.Controllers.Api
{
    public class IpController : ApiController
    {
          public string GetIp()
          {
                return GetClientIp();
          }

          private string GetClientIp(HttpRequestMessage request = null)
          {
                request = request ?? Request;

                if (request.Properties.ContainsKey("MS_HttpContext"))
                {
                      return   ((HttpContextWrapper)request.Properties["MS_HttpContext"]).Request.UserHostAddress;
                }
                else if (request.Properties.ContainsKey(RemoteEndpointMessageProperty.Name))
                {
                     RemoteEndpointMessageProperty prop = (RemoteEndpointMessageProperty)request.Properties[RemoteEndpointMessageProperty.Name];
                     return prop.Address;
                }
                else if (HttpContext.Current != null)
                {
                    return HttpContext.Current.Request.UserHostAddress;
                }
                else
                {
                      return null;
                }
           }
     }
}

Eine andere Möglichkeit, dies zu tun, ist unten.

Referenz: Zugriff auf die Client-IP-Adresse

Für Web-gehostete Version

string clientAddress = HttpContext.Current.Request.UserHostAddress;

Für Selbst gehostete

object property;
        Request.Properties.TryGetValue(typeof(RemoteEndpointMessageProperty).FullName, out property);
        RemoteEndpointMessageProperty remoteProperty = property as RemoteEndpointMessageProperty;
Jalpesh Vadgama
quelle
70

Mit der Web-API 2.2: Request.GetOwinContext().Request.RemoteIpAddress

Ben Wilde
quelle
28
Beachten Sie, dass dies nur funktioniert, wenn Sie Owin - msdn.microsoft.com/en-us/library/…
Chandramouleswaran Ravichandra
16

Versuchen Sie, die IP mit zu bekommen

ip = HttpContext.Current != null ? HttpContext.Current.Request.UserHostAddress : "";
user1587439
quelle
1
@ DenisBabarykin Ich denke, es sollte, .. es gibt die IP-Adresse in der Servervariablen REMOTE_ADDR zurück
user1587439
9

Wenn Sie mit Asp.Net 2.1 mithilfe des OWIN Self-Host NuGet-Pakets selbst hosten, können Sie den folgenden Code verwenden:

 private string getClientIp(HttpRequestMessage request = null)
    {
        if (request == null)
        {
            return null;
        }

        if (request.Properties.ContainsKey("MS_OwinContext"))
        {
            return ((OwinContext) request.Properties["MS_OwinContext"]).Request.RemoteIpAddress;
        }
        return null;
    }
CoryC
quelle
7

Antworten auf diesen 4 Jahre alten Beitrag, da mir dies zu kompliziert erscheint, zumindest wenn Sie auf IIS hosten und dieser Beitrag auf DuckDuckGo (und wahrscheinlich NSAoogle) für "Web-API-Controller IP-Adresse erhalten" sehr hoch ist.

So habe ich es gelöst:

using System;
using System.Net;
using System.Web;
using System.Web.Http;
...
[HttpPost]
[Route("ContactForm")]
public IHttpActionResult PostContactForm([FromBody] ContactForm contactForm)
    {
        var hostname = HttpContext.Current.Request.UserHostAddress;
        IPAddress ipAddress = IPAddress.Parse(hostname);
        IPHostEntry ipHostEntry = Dns.GetHostEntry(ipAddress);
        ...

Im Gegensatz zu OP gibt mir dies die Client-IP und den Client-Hostnamen, nicht den Server. Vielleicht haben sie den Fehler seitdem behoben?

Scott R. Frost
quelle
Würde gerne eine Antwort für die Verwendung der DotNetCore-Web-API sehen. Ich kann nicht glauben, dass es so schwierig ist, etwas so rudimentäres zu tun.
MC9000
5

Es ist besser, es zu HttpContextBasebesetzen, auf diese Weise können Sie es leichter verspotten und testen

public string GetUserIp(HttpRequestMessage request)
{
    if (request.Properties.ContainsKey("MS_HttpContext"))
    {
        var ctx = request.Properties["MS_HttpContext"] as HttpContextBase;
        if (ctx != null)
        {
            return ctx.Request.UserHostAddress;
        }
    }

    return null;
}
Maxime Nanouche
quelle
1
Ich habe herum gegoogelt und andere scheinen dem zuzustimmen (in HttpContextBase anstelle von HttpContextWrapper umgewandelt, weil HttpContextBase leichter zu verspotten ist.)
Dave Clausen
4

Ich denke, dies ist die klarste Lösung mit einer Erweiterungsmethode:

public static class HttpRequestMessageExtensions
{
    private const string HttpContext = "MS_HttpContext";
    private const string RemoteEndpointMessage = "System.ServiceModel.Channels.RemoteEndpointMessageProperty";

    public static string GetClientIpAddress(this HttpRequestMessage request)
    {
        if (request.Properties.ContainsKey(HttpContext))
        {
            dynamic ctx = request.Properties[HttpContext];
            if (ctx != null)
            {
                return ctx.Request.UserHostAddress;
            }
        }

        if (request.Properties.ContainsKey(RemoteEndpointMessage))
        {
            dynamic remoteEndpoint = request.Properties[RemoteEndpointMessage];
            if (remoteEndpoint != null)
            {
                return remoteEndpoint.Address;
            }
        }

        return null;
    }
}

Verwenden Sie es also einfach wie folgt:

var ipAddress = request.GetClientIpAddress();

Wir verwenden dies in unseren Projekten.

Quelle / Referenz: Abrufen der IP-Adresse des Clients in der ASP.NET-Web-API

Vasil Popov
quelle
2

Meine Lösung ähnelt der Antwort von user1587439, funktioniert jedoch direkt auf der Instanz des Controllers (anstatt auf HttpContext.Current zuzugreifen).

Im 'Watch'-Fenster habe ich gesehen, dass this.RequestContext.WebRequest die Eigenschaft' UserHostAddress 'enthält, aber da es auf dem Typ WebHostHttpRequestContext basiert (der in der Assembly' System.Web.Http 'enthalten ist) - war ich nicht Ich konnte direkt darauf zugreifen, also habe ich Reflection verwendet, um direkt darauf zuzugreifen:

string hostAddress = ((System.Web.HttpRequestWrapper)this.RequestContext.GetType().Assembly.GetType("System.Web.Http.WebHost.WebHostHttpRequestContext").GetProperty("WebRequest").GetMethod.Invoke(this.RequestContext, null)).UserHostAddress;

Ich sage nicht, dass es die beste Lösung ist. Die Verwendung von Reflection kann im Falle eines Framework-Upgrades (aufgrund von Namensänderungen) in Zukunft zu Problemen führen, ist jedoch für meine Anforderungen perfekt

Nissim
quelle
0
string userRequest = System.Web.HttpContext.Current.Request.UserHostAddress;

Das funktioniert bei mir.

System.Web.HttpContext.Current.Request.UserHostName;Dieser gibt mir die gleiche Rendite zurück, die ich von der bekomme UserHostAddress.

Robert Tan
quelle