Modo più veloce per ottenere valore numerico dell'indirizzo IP della richiesta in ASP.NET
Domanda
Quale sarebbe il modo più veloce per ottenere il formato numerico ( NON IL FORMATO STRINGA ) del client?
string format : 223.255.254.0
numeric format : 3758095872
Posso postcomputerlo con un codice come
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;
}
basato sulla stringa Request.UserHostAddress ma speravo che IIS o ASP.NET lo precalcolassero e che fosse nascosto da qualche parte in HttpContext.
Mi sbaglio?
Soluzione
HttpContext non sembra fare più magia di quello che vedi già: un valore di stringa in HttpRequest.UserHostAddress
Alcune informazioni di base:
HttpContext.Current.Request
è di tipo System.Web.HttpRequest
che accetta un parametro System.Web.HttpWorkerRequest
as quando viene istanziato.
Il HttpWorkerRequest
è una classe astratta istanziata ospitando implementazioni come, nel caso di IIS, System.Web.Hosting.IIS7WorkerRequest
che poi implementa il metodo astratto GetRemoteAddress()
di HttpWorkerRequest
che viene utilizzato internamente da HttpRequest.UserHostAddress
.
IIS7HttpWorkerRequest
sa che REMOTE_ADDR
è la proprietà IIS che deve leggere e, dopo aver attraversato alcuni altri livelli di astrazione durante il passaggio del contesto della richiesta, tutto finisce finalmente con la chiamata di MgdGetServerVariableW(IntPtr pHandler, string pszVarName, out IntPtr ppBuffer, out int pcchBufferSize);
in webengine.dll che scrive semplicemente una stringa di length pcchBufferSize
in ppBuffer
contenente le stesse cose che ottieni da HttpRequest.UserHostAddress
.
Poiché dubito che ci siano altre parti in HttpContext che ricevono informazioni relative al mittente della richiesta, presumo che dovrai continuare a fare la tua magia per la conversione per la quale ci sono molte idee nel link i pubblicato nei commenti.