Ich bin völlig neu im ASP.NET MVC-Stack und habe mich gefragt, was mit dem einfachen Page-Objekt und dem Request ServerVariables-Objekt passiert ist.
Grundsätzlich möchte ich die IP-Adresse des Client-PCs abrufen, aber ich verstehe nicht, wie die aktuelle MVC-Struktur all dies geändert hat.
Soweit ich verstehen kann, wurden die meisten variablen Objekte durch die HttpRequest-Varianten ersetzt .
Möchte jemand Ressourcen teilen? In der ASP.NET MVC-Welt gibt es wirklich viel zu lernen. :) :)
Zum Beispiel habe ich eine statische Klasse mit dieser aktuellen Funktion. Wie erhalte ich mit ASP.NET MVC das gleiche Ergebnis?
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;
}
Und wie rufe ich diese Funktion von der Controller-Seite auf?
c#
asp.net-mvc
melaos
quelle
quelle
Antworten:
Die einfache Antwort besteht darin, die Eigenschaft HttpRequest.UserHostAddress zu verwenden .
Beispiel: Innerhalb eines Controllers:
Beispiel: Aus einer Hilfsklasse heraus:
ABER wenn die Anforderung von einem oder mehreren Proxyservern weitergeleitet wurde, ist die von der Eigenschaft HttpRequest.UserHostAddress zurückgegebene IP-Adresse die IP-Adresse des letzten Proxyservers, der die Anforderung weitergeleitet hat.
Proxyserver KÖNNEN den De-facto- Standard verwenden, die IP-Adresse des Clients in den HTTP-Header X-Forwarded-For aufzunehmen . Abgesehen davon, dass es keine Garantie dafür gibt, dass eine Anfrage einen X-Forwarded-For-Header hat, gibt es auch keine Garantie dafür, dass das X-Forwarded-For nicht SPOOFED wurde .
Ursprüngliche Antwort
Der obige Code gibt die IP-Adresse des Kunden an, ohne eine Sammlung nachschlagen zu müssen. Die Request-Eigenschaft ist in Controllern (oder Ansichten) verfügbar. Anstatt eine Page-Klasse an Ihre Funktion zu übergeben, können Sie daher ein Request-Objekt übergeben, um dasselbe Ergebnis zu erhalten:
quelle
Request.ServerVariables["REMOTE_ADDR"]
sollte funktionieren - entweder direkt in einer Ansicht oder im Hauptteil der Controller-Aktionsmethode (Request ist eine Eigenschaft der Controller-Klasse in MVC, nicht Page).Es funktioniert .. aber Sie müssen auf einem realen IIS veröffentlichen, nicht auf dem virtuellen.
quelle
Ein Großteil des Codes hier war sehr hilfreich, aber ich habe ihn für meine Zwecke aufgeräumt und einige Tests hinzugefügt. Folgendes habe ich erreicht:
Und hier sind einige NUnit-Tests für diesen Code (ich verwende Rhino Mocks, um die HttpRequestBase zu verspotten, die der M <HttpRequestBase> -Aufruf unten ist):
quelle
publicForwardingIps.First()
?Ich hatte Probleme mit der Verwendung der oben genannten Informationen und benötigte die IP-Adresse eines Controllers. Am Ende habe ich folgendes verwendet:
quelle
HttpContext.Request.UserHostAddress
In einer Klasse könnte man es so nennen:
Ich habe dies in einer Rasiermesser-App mit großartigen Ergebnissen verwendet.
quelle
Wie kann ich erklären, dass meine Website hinter einem Amazon AWS Elastic Load Balancer (ELB) steht:
quelle