Maneira mais rápida de obter valor numérico do endereço IP da solicitação no ASP.NET
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?
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.HttpWorkerRequest
as 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.