Soy totalmente nuevo en la pila ASP.NET MVC, y me preguntaba qué pasó con el simple objeto Page y el objeto Request ServerVariables.
Básicamente, quiero extraer la dirección IP de la PC cliente, pero no entiendo cómo la estructura MVC actual ha cambiado todo esto.
Hasta donde puedo entender, la mayoría de los objetos variables han sido reemplazados por las variantes HttpRequest .
¿Alguien quiere compartir algunos recursos? Realmente hay un mar de cosas para aprender en el mundo ASP.NET MVC. :)
Por ejemplo, tengo una clase estática con esta función actual. ¿Cómo obtengo el mismo resultado con 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;
}
¿Y cómo llamo a esta función desde la página del controlador?
c#
asp.net-mvc
melaos
fuente
fuente
Respuestas:
La respuesta simple es usar la propiedad HttpRequest.UserHostAddress .
Ejemplo: desde un controlador:
Ejemplo: desde una clase auxiliar:
PERO, si la solicitud ha sido transmitida por uno o más servidores proxy , la dirección IP devuelta por la propiedad HttpRequest.UserHostAddress será la dirección IP del último servidor proxy que transmitió la solicitud.
Los servidores proxy PUEDEN usar el estándar de facto de colocar la dirección IP del cliente en el encabezado HTTP X-Fordered-For . Aparte de que no hay garantía de que una solicitud tenga un encabezado X-Fordered-For, tampoco hay garantía de que el X-Forward-For no haya sido SPOFED .
Respuesta original
El código anterior proporciona la dirección IP del Cliente sin tener que buscar una colección. La propiedad Solicitud está disponible en Controladores (o Vistas). Por lo tanto, en lugar de pasar una clase de página a su función, puede pasar un objeto Solicitud para obtener el mismo resultado:
fuente
Request.ServerVariables["REMOTE_ADDR"]
debería funcionar, ya sea directamente en una vista o en el cuerpo del método de acción del controlador (Request es una propiedad de la clase Controller en MVC, no Page).Está funcionando ... pero debe publicar en un IIS real, no virtual.
fuente
Gran parte del código aquí fue muy útil, pero lo limpié para mis propósitos y agregué algunas pruebas. Esto es lo que terminé con:
Y aquí hay algunas pruebas de NUnit contra ese código (estoy usando Rhino Mocks para burlarse de HttpRequestBase, que es la llamada M <HttpRequestBase> a continuación):
fuente
publicForwardingIps.First()
?Tuve problemas para usar lo anterior y necesitaba la dirección IP de un controlador. Usé lo siguiente al final:
fuente
HttpContext.Request.UserHostAddress
En una clase podrías llamarlo así:
Utilicé esto en una aplicación de afeitar con excelentes resultados.
fuente
Cómo considero que mi sitio está detrás de un Amazon AWS Elastic Load Balancer (ELB):
fuente