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;
        }
    }
Arbejdsglæde
źródło
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
Możliwy duplikat Uzyskaj adres IP zdalnego hosta
Michael Freidgeim

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;
Jalpesh Vadgama
źródło
71

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

Ben Wilde
źródło
28
Zauważ, że to działa tylko, jeśli używasz Owin - msdn.microsoft.com/en-us/library/…
Chandramouleswaran Ravichandra
16

Spróbuj uzyskać IP za pomocą

ip = HttpContext.Current != null ? HttpContext.Current.Request.UserHostAddress : "";
user1587439
źródło
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;
    }
CoryC
źródło
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?

Scott R. Frost
źródło
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;
}
Maxime Nanouche
źródło
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

Vasil Popov
źródło
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

Nissim
źródło
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.

Robert Tan
źródło