webentwicklung-frage-antwort-db.com.de

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

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

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;
        }
    }
104
Arbejdsglæde

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

referenz: Erhalten der 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, finden Sie weiter unten.

referenz: wie-auf-die-Client-s-IP-Adresse-zugegriffen wird

Für Web gehostete Version

string clientAddress = HttpContext.Current.Request.UserHostAddress;

Für selbst gehostet

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

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

68
Ben Wilde

Versuchen Sie, das IP mit

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

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

Es ist besser, es in HttpContextBase umzuwandeln. 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;
}
5
Maxime Nanouche

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

Also benutze es einfach so:

var ipAddress = request.GetClientIpAddress();

Wir nutzen dies in unseren Projekten.

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

4
Vasil Popov

Auf diesen 4 Jahre alten Beitrag antworten, da mir dies zu kompliziert erscheint, zumindest wenn Sie auf IIS) hosten und dieser Beitrag bei DuckDuckGo (und wahrscheinlich bei NSAoogle) für "web api" sehr hoch ist Controller bekommt IP-Adresse ".

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 werden hier die Client-IP und der Client-Hostname angezeigt, nicht der Server. Vielleicht haben sie den Fehler seitdem behoben?

4
Scott R. Frost

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

Im Fenster "Überwachen" habe ich festgestellt, dass this.RequestContext.WebRequest die Eigenschaft "UserHostAddress" enthält, dies war jedoch nicht der Fall, da der Typ "WebHostHttpRequestContext" (intern in der Assembly "System.Web.Http") verwendet wird Da ich direkt darauf zugreifen kann, 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 in Zukunft Probleme verursachen, wenn das Framework aktualisiert wird (aufgrund von Namensänderungen), aber für meine Anforderungen ist es perfekt

2
Nissim