Jestem zupełnie nowy w stosie ASP.NET MVC i zastanawiałem się, co stało się z prostym obiektem Page i obiektem Request ServerVariables?
Zasadniczo chcę wyciągnąć adres IP komputera klienckiego, ale nie rozumiem, jak zmieniła to wszystko obecna struktura MVC.
O ile rozumiem, większość obiektów zmiennych została zastąpiona wariantami HttpRequest .
Czy ktoś chce udostępnić jakieś zasoby? W świecie ASP.NET MVC naprawdę jest mnóstwo rzeczy do nauczenia się. :)
Na przykład mam klasę statyczną z tą bieżącą funkcją. Jak uzyskać ten sam wynik za pomocą ASP.NET MVC?
public static int getCountry(Page page)
{
return getCountryFromIP(getIPAddress(page));
}
public static string getIPAddress(Page page)
{
string szRemoteAddr = page.Request.ServerVariables["REMOTE_ADDR"];
string szXForwardedFor = page.Request.ServerVariables["X_FORWARDED_FOR"];
string szIP = "";
if (szXForwardedFor == null)
{
szIP = szRemoteAddr;
}
else
{
szIP = szXForwardedFor;
if (szIP.IndexOf(",") > 0)
{
string [] arIPs = szIP.Split(',');
foreach (string item in arIPs)
{
if (!isPrivateIP(item))
{
return item;
}
}
}
}
return szIP;
}
I jak wywołać tę funkcję ze strony kontrolera?
c#
asp.net-mvc
Melaos
źródło
źródło
Odpowiedzi:
Prostą odpowiedzią jest użycie właściwości HttpRequest.UserHostAddress .
Przykład: z poziomu kontrolera:
Przykład: z poziomu klasy pomocnika:
ALE, jeśli żądanie zostało przekazane przez jeden lub więcej serwerów proxy, wówczas adres IP zwrócony przez HttpRequest.UserHostAddress będzie adresem IP ostatniego serwera proxy, który przekazał żądanie.
Serwery proxy MOGĄ używać de facto standardu umieszczania adresu IP klienta w nagłówku HTTP X-Forwarded-For . Poza tym nie ma gwarancji, że żądanie ma nagłówek X-Forwarded-For, nie ma również gwarancji, że X-Forwarded-For nie został SPOOFED .
Oryginalna odpowiedź
Powyższy kod podaje adres IP klienta bez konieczności wyszukiwania kolekcji. Właściwość Request jest dostępna w ramach kontrolerów (lub widoków). Dlatego zamiast przekazywać klasę Page do funkcji, możesz przekazać obiekt Request, aby uzyskać ten sam wynik:
źródło
Request.ServerVariables["REMOTE_ADDR"]
powinien działać - albo bezpośrednio w widoku, albo w treści metody akcji kontrolera (Request jest właściwością klasy Controller w MVC, a nie Page).Działa .. ale musisz publikować na prawdziwym IIS, a nie wirtualnym.
źródło
Wiele kodu tutaj było bardzo pomocne, ale wyczyściłem go dla moich celów i dodałem kilka testów. Oto, z czym skończyłem:
A oto kilka testów NUnit dla tego kodu (używam Rhino Mocks, aby wyśmiewać HttpRequestBase, czyli wywołanie M <HttpRequestBase> poniżej):
źródło
publicForwardingIps.First()
?Miałem problem z użyciem powyższego i potrzebowałem adresu IP z kontrolera. W końcu zastosowałem następujące:
źródło
HttpContext.Request.UserHostAddress
W klasie możesz to tak nazwać:
Użyłem tego w aplikacji maszynki do golenia ze świetnymi wynikami.
źródło
Jak rozliczam moją witrynę za moduł równoważenia obciążenia elastycznego Amazon AWS (ELB):
źródło