web-dev-qa-db-fra.com

Asp Net Web API 2.1 obtenir l'adresse IP du client

Bonjour, j'ai besoin de l'adresse IP du client qui demande une méthode dans l'API Web. J'ai essayé d'utiliser ce code de ici mais il retourne toujours l'adresse IP locale du serveur. Comment obtenir de manière correcte?

HttpContext.Current.Request.UserHostAddress;

d'autres questions:

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

Le lien suivant peut vous aider. Voici le code du lien suivant.

référence: obtenir-le-client-ip-via-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;
                }
           }
     }
}

Une autre façon de faire est ci-dessous.

référence: comment-accéder-le-client-s-ip-address

Pour la version hébergée sur le Web

string clientAddress = HttpContext.Current.Request.UserHostAddress;

Pour auto-hébergé

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

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

68
Ben Wilde

Essayez d’obtenir l’Ip en utilisant

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

Si vous hébergez vous-même avec Asp.Net 2.1 à l'aide du package OWIN Self-Host NuGet, vous pouvez utiliser le code suivant:

 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

Il vaut mieux le lancer dans HttpContextBase pour pouvoir se moquer et le tester plus facilement.

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

Je pense que c'est la solution la plus claire, utilisant une méthode d'extension:

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

Alors utilisez-le simplement comme:

var ipAddress = request.GetClientIpAddress();

Nous l'utilisons dans nos projets.

Source/Référence: Récupération de l’adresse IP du client dans l’API Web ASP.NET

4
Vasil Popov

Répondre à ce message de 4 ans, parce que cela me semble trop compliqué, du moins si vous hébergez sur IIS et que ce message est très volumineux sur DuckDuckGo (et probablement NSAoogle) pour "contrôleur d'API Web obtenir IP adresse".

Voici comment je l'ai résolu:

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);
        ...

Contrairement à l'OP, cela me donne l'adresse IP du client et le nom d'hôte du client, pas le serveur. Peut-être qu'ils ont corrigé le bogue depuis?

4
Scott R. Frost

Ma solution est similaire à la réponse de user1587439, mais fonctionne directement sur l'instance du contrôleur (au lieu d'accéder à HttpContext.Current).

Dans la fenêtre 'Regarder', j'ai vu que this.RequestContext.WebRequest contenait la propriété 'UserHostAddress', mais puisqu'elle s'appuie sur le type WebHostHttpRequestContext (interne à l'assembly 'System.Web.Http'), ce n'était pas le cas capable d'y accéder directement, j'ai donc utilisé la réflexion pour y accéder directement:

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

Je ne dis pas que c'est la meilleure solution. l'utilisation de la réflexion peut poser problème à l'avenir en cas de mise à niveau de la structure (en raison de changements de nom), mais pour mes besoins, c'est parfait

2
Nissim