W ASP.NET istnieje System.Web.HttpRequest
klasa, która zawiera ServerVariables
właściwość, która może dostarczyć nam adres IP z REMOTE_ADDR
wartości właściwości.
Jednak nie udało mi się znaleźć podobnego sposobu uzyskania adresu IP zdalnego hosta z ASP.NET Web API.
Jak mogę uzyskać adres IP zdalnego hosta, który wysyła żądanie?
c#
asp.net-web-api
paulius_l
źródło
źródło
RemoteEndpointMessageProperty
klasa jest wSystem.ServiceModel.Channels
przestrzeni nazw,System.ServiceModel.dll
zestawie? Czy to nie jest zestaw należący do WCF?To rozwiązanie obejmuje również samoobsługowy interfejs API sieci Web przy użyciu Owin. Częściowo stąd .
Możesz utworzyć prywatną metodę,
ApiController
która będzie zwracać zdalny adres IP bez względu na sposób hostowania internetowego interfejsu API:Wymagane referencje:
HttpContextWrapper
- System.Web.dllRemoteEndpointMessageProperty
- System.ServiceModel.dllOwinContext
- Microsoft.Owin.dll (będziesz go już mieć, jeśli używasz pakietu Owin)Mały problem z tym rozwiązaniem polega na tym, że musisz załadować biblioteki dla wszystkich 3 przypadków, gdy faktycznie będziesz używać tylko jednej z nich podczas działania. Jak sugerowano tutaj , można temu zaradzić za pomocą
dynamic
zmiennych. Możesz również napisaćGetClientIpAddress
metodę jako rozszerzenie dlaHttpRequestMethod
.Teraz możesz go używać w ten sposób:
źródło
using System.Net.Http;
linii, ponieważ przedłużaszHttpRequestMessage
. Chyba że definiujesz swoje rozszerzenie wSystem.Net.Http
przestrzeni nazw, co jest bardzo wątpliwe. Nie jestem pewien, czy jest to niezbędne, ponieważ zostanie automatycznie dodane przez dowolne narzędzie IDE lub narzędzie zwiększające produktywność. Co myślisz?Jeśli naprawdę potrzebujesz jednowierszowego rozwiązania i nie planujesz samodzielnego hostowania internetowego interfejsu API:
źródło
Powyższe odpowiedzi wymagają odwołania do System.Web, aby móc rzutować właściwość na HttpContext lub HttpContextWrapper. Jeśli nie chcesz odniesienia, możesz uzyskać adres IP za pomocą dynamicznego:
źródło
Rozwiązanie dostarczone przez carlosfigueira działa, ale jednowierszowe z bezpiecznym typem są lepsze: dodaj a
using System.Web
then accessHttpContext.Current.Request.UserHostAddress
w swojej metodzie działania.źródło
HttpContext.Current
nie jest on poprawnie utrwalany w potoku zadań; ponieważ cała obsługa żądań jest asynchroniczna.HttpContext.Current
należy prawie zawsze unikać podczas pisania kodu interfejsu API sieci Web.SynchronizationContext
przepływa poprawnie między zadaniami); Największym problemem jest to, że kod usługi może kiedykolwiek znajdować się na własnym serwerze (na przykład testowanie) -HttpContext.Current
jest konstrukcją czysto Asp.Net i nie istnieje podczas samodzielnego hostowania.NullReferenceException
jeśli zostanie użyty z wątku (np. Narzędzie oczekujące na zadanie, bardzo powszechne we współczesnym kodzie interfejsu API sieci Web) lub w kontekście hostowanym samodzielnie. Przynajmniej większość innych odpowiedzi po prostu wrócinull
.