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

112

Bonjour, j'ai besoin d'obtenir une adresse IP client qui demande une méthode dans l'api Web, j'ai essayé d'utiliser ce code à partir d' ici mais il renvoie toujours l'adresse IP locale du serveur, comment s'y rendre correctement?

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;
        }
    }
Arbejdsglæde
la source
Cette méthode d'extension fonctionne bien pour moi. (Je n'utilise pas OWIN ou quelque chose d'inhabituel.)
Nate Barbettini
super pour reconnaître la source. Édité
Stefano Mtangoo
Double

Réponses:

124

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

référence: obtenant-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.

reference: comment accéder à l'adresse IP du client

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;
Jalpesh Vadgama
la source
71

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

Ben Wilde
la source
28
Notez que cela ne fonctionne que si vous utilisez Owin - msdn.microsoft.com/en-us/library/…
Chandramouleswaran Ravichandra
16

Essayez d'obtenir l'IP en utilisant

ip = HttpContext.Current != null ? HttpContext.Current.Request.UserHostAddress : "";
user1587439
la source
1
@DenisBabarykin Je pense qu'il devrait, .. il renvoie l'adresse IP dans la variable serveur REMOTE_ADDR
user1587439
9

Si vous vous auto-hébergez avec Asp.Net 2.1 à l'aide du package NuGet OWIN Self-host, 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;
    }
CoryC
la source
7

En réponse à ce post vieux de 4 ans, car cela me semble trop compliqué, du moins si vous hébergez sur IIS et que ce post est très élevé sur DuckDuckGo (et probablement NSAoogle) pour "le contrôleur de l'API Web obtient l'adresse IP".

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 à OP, cela me donne l'adresse IP du client et le nom d'hôte du client, pas le serveur. Peut-être ont-ils corrigé le bogue depuis?

Scott R. Frost
la source
J'adorerais voir une réponse pour l'utilisation de l'API Web DotNetCore. Je ne peux pas croire que ce soit aussi difficile de faire quelque chose d'aussi rudimentaire.
MC9000
5

Il est préférable de le lancer HttpContextBase, de cette façon, vous pouvez vous 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;
}
Maxime Nanouche
la source
1
J'ai cherché sur Google et d'autres semblent être d'accord avec cela (cast en HttpContextBase au lieu de HttpContextWrapper car HttpContextBase est plus facile à se moquer.)
Dave Clausen
4

Je pense que c'est la solution la plus claire, en 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 utilisons cela dans nos projets.

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

Vasil Popov
la source
2

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 'Watch', j'ai vu que this.RequestContext.WebRequest contient la propriété 'UserHostAddress', mais comme il repose sur le type WebHostHttpRequestContext (qui est interne à l'assembly 'System.Web.Http') - je ne l'étais pas 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 causer des problèmes à l'avenir en cas de mise à niveau du framework (en raison de changements de nom), mais pour mes besoins, c'est parfait

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

Cela fonctionne sur moi.

System.Web.HttpContext.Current.Request.UserHostName;celui-ci me renvoie le même retour que je reçois du UserHostAddress.

Robert Tan
la source