Asp Net Web API 2.1 ottiene l'indirizzo IP del client


112

Ciao, ho bisogno di ottenere l'IP del client che richiede un metodo in web api, ho provato a utilizzare questo codice da qui ma restituisce sempre l'IP locale del server, come ottenere in modo corretto?

HttpContext.Current.Request.UserHostAddress;

da altre domande:

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

Questo metodo di estensione funziona bene per me. (Non sto usando OWIN o qualcosa di insolito.)
Nate Barbettini

ottimo per riconoscere la fonte. A cura di
Stefano Mtangoo

Risposte:


124

Il seguente link potrebbe aiutarti. Ecco il codice dal seguente collegamento.

riferimento: ottenere-the-client-ip-tramite-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;
                }
           }
     }
}

Un altro modo per farlo è di seguito.

riferimento: how-to-access-the-client-s-ip-address

Per la versione ospitata sul web

string clientAddress = HttpContext.Current.Request.UserHostAddress;

Per auto ospitato

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


16

Prova a ottenere l'IP usando

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

1
@DenisBabarykin Penso che dovrebbe, .. restituisce l'indirizzo IP nella variabile del server REMOTE_ADDR
user1587439

9

Se si esegue l'hosting autonomo con Asp.Net 2.1 utilizzando il pacchetto NuGet self-host OWIN, è possibile utilizzare il codice seguente:

 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

Rispondendo a questo post di 4 anni fa, perché questo mi sembra complicato, almeno se stai ospitando su IIS e questo post è molto alto su DuckDuckGo (e probabilmente NSAoogle) per "web api controller get IP address".

Ecco come l'ho risolto:

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

A differenza di OP, questo mi fornisce l'IP del client e il nome host del client, non il server. Forse hanno risolto il bug da allora?


Mi piacerebbe vedere una risposta per l'utilizzo dell'API web DotNetCore. Non posso credere che sia così difficile fare qualcosa di così rudimentale.
MC9000

5

È meglio lanciarlo HttpContextBase, in questo modo puoi deriderlo e testarlo più facilmente

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
Ho cercato su Google e altri sembrano concordare con questo (cast su HttpContextBase invece di HttpContextWrapper perché HttpContextBase è più facile da deridere.)
Dave Clausen

4

Penso che questa sia la soluzione più chiara, utilizzando un metodo di estensione:

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

Quindi usalo come:

var ipAddress = request.GetClientIpAddress();

Lo usiamo nei nostri progetti.

Origine / Riferimento: recupero dell'indirizzo IP del client nell'API Web ASP.NET


2

La mia soluzione è simile alla risposta di user1587439, ma funziona direttamente sull'istanza del controller (invece di accedere a HttpContext.Current).

Nella finestra "Watch", ho visto che this.RequestContext.WebRequest contiene la proprietà 'UserHostAddress', ma poiché si basa sul tipo WebHostHttpRequestContext (che è interno all'assembly 'System.Web.Http'), non lo ero in grado di accedervi direttamente, quindi ho usato la riflessione per accedervi direttamente:

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

Non sto dicendo che sia la soluzione migliore. l'utilizzo di reflection può causare problemi in futuro in caso di aggiornamento del framework (a causa di modifiche al nome), ma per le mie esigenze è perfetto


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

Questo funziona su di me.

System.Web.HttpContext.Current.Request.UserHostName;questo mi restituisce lo stesso ritorno che ricevo dal UserHostAddress.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.