Maneira mais rápida de obter valor numérico do endereço IP da solicitação no ASP.NET

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

  •  28-10-2019
  •  | 
  •  

Pergunta

Qual seria a maneira mais rápida de obter o formato numérico ( NÃO O FORMATO DA STRING ) do cliente?

string format  : 223.255.254.0
numeric format : 3758095872

Posso postar isso por meio de algum 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;
    }

com base na string Request.UserHostAddress, mas eu esperava que o IIS ou ASP.NET precomputasse isso e estivesse em algum lugar escondido no HttpContext.

Estou errado?

Foi útil?

Solução

HttpContext não parece estar fazendo mais mágica do que você já viu: um valor de string em HttpRequest.UserHostAddress

Algumas informações básicas:

HttpContext.Current.Request é do tipo System.Web.HttpRequest, que recebe um parâmetro System.Web.HttpWorkerRequestas quando instanciado.

O HttpWorkerRequest é uma classe abstrata instanciada por implementações de hospedagem como, no caso do IIS, System.Web.Hosting.IIS7WorkerRequest que então implementa o método abstrato GetRemoteAddress() de HttpWorkerRequest que é usado internamente por HttpRequest.UserHostAddress.

IIS7HttpWorkerRequest sabe que REMOTE_ADDR é a propriedade IIS que ela precisa ler e, depois de passar por mais algumas camadas de abstração enquanto passa pelo contexto da solicitação, tudo finalmente termina em chamar MgdGetServerVariableW(IntPtr pHandler, string pszVarName, out IntPtr ppBuffer, out int pcchBufferSize); em webengine.dll, que simplesmente escreve uma string de length pcchBufferSize em ppBuffer contendo as mesmas coisas que você obtém em HttpRequest.UserHostAddress.

Como duvido que haja outras partes no HttpContext que recebem informações relacionadas ao remetente da solicitação, estou assumindo que você terá que continuar fazendo sua própria mágica para conversão, para a qual há muitas ideias no link i postado nos comentários.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top