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;
}
}
c#
asp.net
asp.net-web-api
Arbejdsglæde
źródło
źródło
Odpowiedzi:
Poniższy link może ci pomóc. Oto kod z poniższego linku.
odniesienie: pobieranie-the-client-ip-via-asp-net-web-api
Poniżej znajduje się inny sposób na zrobienie tego.
Odniesienie: jak uzyskać dostęp do adresu IP klienta
Wersja hostowana przez internet
Do samodzielnego hostowania
źródło
Z Web API 2.2:
Request.GetOwinContext().Request.RemoteIpAddress
źródło
Spróbuj uzyskać IP za pomocą
źródło
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:
źródło
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:
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?
źródło
Lepiej go rzucić
HttpContextBase
, w ten sposób można go łatwiej kpić i testowaćźródło
Myślę, że jest to najbardziej przejrzyste rozwiązanie, wykorzystujące metodę rozszerzającą:
Więc po prostu używaj go tak:
Używamy tego w naszych projektach.
Źródło / odniesienie: pobieranie adresu IP klienta w interfejsie API sieci Web ASP.NET
źródło
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
źródło
To na mnie działa.
System.Web.HttpContext.Current.Request.UserHostName;
ten zwraca mi ten sam zwrot, który otrzymuję zUserHostAddress
.źródło