La forma más rápida de obtener el valor numérico de la dirección IP de la solicitud en ASP.NET

StackOverflow https://stackoverflow.com/questions/6383997

  •  28-10-2019
  •  | 
  •  

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?

¿Fue útil?

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.HttpWorkerRequestas 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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top