Der schnellste Weg, um den numerischen Wert der IP-Adresse der Anforderung in ASP.NET abzurufen
Frage
Was wäre der schnellste Weg, um das numerische Format ( NICHT DAS STRING-FORMAT ) des Clients zu erhalten?
string format : 223.255.254.0
numeric format : 3758095872
Ich kann dies mit einem Code wie nachrechnen
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;
}
basiert auf der Zeichenfolge Request.UserHostAddress, aber ich hatte gehofft, dass IIS oder ASP.NET dies vorberechnet und es irgendwo im HttpContext versteckt ist.
Liege ich falsch?
Lösung
HttpContext scheint nicht magischer zu sein als das, was Sie bereits sehen: ein Zeichenfolgenwert in HttpRequest.UserHostAddress
Einige Hintergrundinformationen:
HttpContext.Current.Request
ist vom Typ System.Web.HttpRequest
, der beim Instanziieren einen System.Web.HttpWorkerRequest
as-Parameter verwendet.
Der HttpWorkerRequest
ist eine abstrakte Klasse, die durch Hosting von Implementierungen wie im Fall von IIS instanziiert wird. System.Web.Hosting.IIS7WorkerRequest
implementiert dann die abstrakte Methode GetRemoteAddress()
von HttpWorkerRequest
, die intern von HttpRequest.UserHostAddress
verwendet wird.
IIS7HttpWorkerRequest
weiß, dass REMOTE_ADDR
die IIS-Eigenschaft ist, die gelesen werden muss, und nachdem einige weitere Abstraktionsebenen durchlaufen wurden, während der Anforderungskontext übergeben wurde, endet alles mit dem Aufruf von MgdGetServerVariableW(IntPtr pHandler, string pszVarName, out IntPtr ppBuffer, out int pcchBufferSize);
in webengine.dll, der einfach eine Zeichenfolge von schreibt Länge pcchBufferSize
in ppBuffer
, der das gleiche Material enthält, das Sie von HttpRequest.UserHostAddress
erhalten.
Da ich bezweifle, dass es andere Teile im HttpContext gibt, die Informationen zum Anforderungssender erhalten, gehe ich davon aus, dass Sie weiterhin Ihre eigene Magie für die Konvertierung anwenden müssen, für die der Link i viele Ideen enthält in den Kommentaren gepostet.