Je suis totalement nouveau dans la pile ASP.NET MVC et je me demandais ce qui était arrivé à l'objet Page simple et à l'objet Request ServerVariables?
Fondamentalement, je veux retirer l'adresse IP du PC client, mais je n'arrive pas à comprendre comment la structure MVC actuelle a changé tout cela.
Pour autant que je puisse comprendre, la plupart des objets variables ont été remplacés par les variantes HttpRequest .
Quelqu'un veut-il partager des ressources? Il y a vraiment une mer de choses à apprendre dans le monde ASP.NET MVC. :)
Par exemple, j'ai une classe statique avec cette fonction actuelle. Comment obtenir le même résultat en utilisant 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;
}
Et comment appeler cette fonction depuis la page du contrôleur?
c#
asp.net-mvc
melaos
la source
la source
Réponses:
La réponse simple consiste à utiliser la propriété HttpRequest.UserHostAddress .
Exemple: à partir d'un contrôleur:
Exemple: à partir d'une classe d'assistance:
MAIS, si la demande a été transmise par un ou plusieurs serveurs proxy , l'adresse IP renvoyée par la propriété HttpRequest.UserHostAddress sera l'adresse IP du dernier serveur proxy qui a relayé la demande.
Les serveurs proxy PEUVENT utiliser la norme de facto de placer l'adresse IP du client dans l'en - tête HTTP X-Forwarded-For . En plus de cela, il n'y a aucune garantie qu'une requête a un en-tête X-Forwarded-For, il n'y a également aucune garantie que le X-Forwarded-For n'a pas été SPOOFED .
Réponse originale
Le code ci-dessus fournit l'adresse IP du client sans recourir à la recherche d'une collection. La propriété Request est disponible dans les contrôleurs (ou les vues). Par conséquent, au lieu de passer une classe Page à votre fonction, vous pouvez passer un objet Request pour obtenir le même résultat:
la source
Request.ServerVariables["REMOTE_ADDR"]
devrait fonctionner - soit directement dans une vue, soit dans le corps de la méthode d'action du contrôleur (Request est une propriété de la classe Controller dans MVC, pas Page).Cela fonctionne .. mais vous devez publier sur un vrai IIS pas le virtuel.
la source
Une grande partie du code ici a été très utile, mais je l'ai nettoyé à mes fins et ajouté quelques tests. Voici ce que j'ai fini avec:
Et voici quelques tests NUnit contre ce code (j'utilise Rhino Mocks pour se moquer de HttpRequestBase, qui est l'appel M <HttpRequestBase> ci-dessous):
la source
publicForwardingIps.First()
?J'ai eu du mal à utiliser ce qui précède et j'avais besoin de l'adresse IP d'un contrôleur. J'ai finalement utilisé ce qui suit:
la source
HttpContext.Request.UserHostAddress
Dans une classe, vous pourriez l'appeler comme ceci:
Je l'ai utilisé dans une application de rasoir avec d'excellents résultats.
la source
Comment je compte que mon site est derrière un Amazon AWS Elastic Load Balancer (ELB):
la source