Der schnellste Weg, um den numerischen Wert der IP-Adresse der Anforderung in ASP.NET abzurufen

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

  •  28-10-2019
  •  | 
  •  

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?

War es hilfreich?

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

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top