Asp Net Web API 2.1 pobiera adres IP klienta


112

Witam, potrzebuję adresu IP klienta, który żąda jakiejś metody w interfejsie internetowym, próbowałem użyć tego kodu stąd, ale zawsze zwraca lokalny adres IP serwera, jak uzyskać poprawny sposób?

HttpContext.Current.Request.UserHostAddress;

z innych pytań:

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

Ta metoda rozszerzenia działa dobrze dla mnie. (Nie używam OWIN ani niczego niezwykłego.)
Nate Barbettini

wspaniale jest uznać źródło. Edytowane
Stefano Mtangoo

Odpowiedzi:


124

Poniższy link może ci pomóc. Oto kod z poniższego linku.

odniesienie: pobieranie-the-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;
                }
           }
     }
}

Poniżej znajduje się inny sposób na zrobienie tego.

Odniesienie: jak uzyskać dostęp do adresu IP klienta

Wersja hostowana przez internet

string clientAddress = HttpContext.Current.Request.UserHostAddress;

Do samodzielnego hostowania

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


16

Spróbuj uzyskać IP za pomocą

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

1
@DenisBabarykin myślę, że powinien, .. zwraca adres IP w zmiennej serwera REMOTE_ADDR
user1587439

9

Jeśli korzystasz z samodzielnego hostingu z Asp.Net 2.1 przy użyciu pakietu NuGet do samodzielnego hostowania OWIN, możesz użyć następującego kodu:

 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

Odpowiadając na ten 4-letni post, ponieważ wydaje mi się to zbyt skomplikowane, przynajmniej jeśli korzystasz z hostingu w IIS, a ten post jest bardzo wysoki na DuckDuckGo (i prawdopodobnie NSAoogle) dla „web api controller get IP address”.

Oto jak to rozwiązałem:

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

W przeciwieństwie do OP daje mi to adres IP klienta i nazwę hosta klienta, a nie serwer. Być może od tamtej pory naprawili błąd?


Chciałbym zobaczyć odpowiedź dotyczącą korzystania z internetowego interfejsu API DotNetCore. Nie mogę uwierzyć, że trudno jest zrobić coś tak prymitywnego.
MC9000

5

Lepiej go rzucić HttpContextBase, w ten sposób można go łatwiej kpić i testować

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
Przeszukałem go w Google i inni wydają się zgadzać z tym (rzut do HttpContextBase zamiast HttpContextWrapper, ponieważ HttpContextBase jest łatwiejszy do wyszydzenia).
Dave Clausen

4

Myślę, że jest to najbardziej przejrzyste rozwiązanie, wykorzystujące metodę rozszerzającą:

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

Więc po prostu używaj go tak:

var ipAddress = request.GetClientIpAddress();

Używamy tego w naszych projektach.

Źródło / odniesienie: pobieranie adresu IP klienta w interfejsie API sieci Web ASP.NET


2

Moje rozwiązanie jest podobne do odpowiedzi użytkownika1587439, ale działa bezpośrednio na instancji kontrolera (zamiast uzyskiwania dostępu do HttpContext.Current).

W oknie „Watch” widziałem, że this.RequestContext.WebRequest zawiera właściwość „UserHostAddress”, ale ponieważ opiera się na typie WebHostHttpRequestContext (który jest wewnętrzny dla zestawu „System.Web.Http”) - tak nie było mam do niego bezpośredni dostęp, więc użyłem refleksji, aby uzyskać do niego bezpośredni dostęp:

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

Nie mówię, że to najlepsze rozwiązanie. używanie refleksji może powodować problemy w przyszłości w przypadku aktualizacji frameworka (ze względu na zmianę nazwy), ale dla moich potrzeb jest to idealne


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

To na mnie działa.

System.Web.HttpContext.Current.Request.UserHostName;ten zwraca mi ten sam zwrot, który otrzymuję z UserHostAddress.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.