La forma más rápida de obtener el valor numérico de la dirección IP de la solicitud en ASP.NET
Pregunta
¿Cuál sería la forma más rápida de obtener el formato numérico ( NO EL FORMATO DE CADENA ) del cliente?
string format : 223.255.254.0
numeric format : 3758095872
Puedo calcular esto posteriormente mediante un código como
static public uint IPAddressToLong(string ipAddress)
{
var oIP = IPAddress.Parse(ipAddress);
var byteIP = oIP.GetAddressBytes();
var ip = (uint)byteIP[0] << 24;
ip += (uint)byteIP[1] << 16;
ip += (uint)byteIP[2] << 8;
ip += byteIP[3];
return ip;
}
basado en la cadena Request.UserHostAddress, pero esperaba que IIS o ASP.NET calcularan previamente esto y esté oculto en algún lugar de HttpContext.
¿Me equivoco?
Solución
HttpContext no parece estar haciendo más magia de la que ya ves: un valor de cadena en HttpRequest.UserHostAddress
Alguna información de antecedentes:
HttpContext.Current.Request
es de tipo System.Web.HttpRequest
que toma un parámetro System.Web.HttpWorkerRequest
as cuando se crea una instancia.
El HttpWorkerRequest
es una clase abstracta instanciada por implementaciones de alojamiento como, en el caso de IIS, System.Web.Hosting.IIS7WorkerRequest
que luego implementa el método abstracto GetRemoteAddress()
de HttpWorkerRequest
que es utilizado internamente por HttpRequest.UserHostAddress
.
IIS7HttpWorkerRequest
sabe que REMOTE_ADDR
es la propiedad de IIS que necesita leer y, después de pasar por algunas capas más de abstracción mientras pasa por el contexto de la solicitud, todo finalmente termina llamando a MgdGetServerVariableW(IntPtr pHandler, string pszVarName, out IntPtr ppBuffer, out int pcchBufferSize);
en webengine.dll que simplemente escribe una cadena de length pcchBufferSize
en ppBuffer
que contiene el mismo material que obtiene de HttpRequest.UserHostAddress
.
Dado que dudo que haya otras partes en HttpContext que reciban información relacionada con el remitente de la solicitud, supongo que tendrás que seguir haciendo tu propia magia para la conversión, para lo cual hay muchas ideas en el enlace i publicado en los comentarios.