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;
        }
    }

Diese Erweiterungsmethode funktioniert gut für mich. (Ich benutze nicht OWIN oder etwas Ungewöhnliches.)
Nate Barbettini

großartig, Quelle anzuerkennen. Bearbeitet
Stefano Mtangoo

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;


16

Versuchen Sie, die IP mit zu bekommen

ip = HttpContext.Current != null ? HttpContext.Current.Request.UserHostAddress : "";

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;
    }

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?


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;
}

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


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


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.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.