Moyen le plus rapide d'obtenir une valeur numérique de l'adresse IP de la demande dans ASP.NET
Question
Quel serait le moyen le plus rapide d'obtenir le format numérique (Pas le format de chaîne) du client?
string format : 223.255.254.0
numeric format : 3758095872
Je peux post-ordinateur par un code comme
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;
}
Sur la base de la chaîne de demande.UserHostAddress, mais j'espérais que IIS ou ASP.NET précomputer cela et il est quelque part caché dans le HTTPContext.
Ai-je tort?
La solution
HttpContext ne semble pas faire plus de magie que ce que vous voyez déjà: une valeur de chaîne en HttpRequest.UserHostAddress
Quelques informations de fond:
HttpContext.Current.Request
est de type System.Web.HttpRequest
qui prend un System.Web.HttpWorkerRequest
comme paramètre lorsqu'il est instancié.
La HttpWorkerRequest
est une classe abstraite instanciée en hébergeant des implémentations comme, dans le cas de l'IIS, System.Web.Hosting.IIS7WorkerRequest
qui implémente ensuite la méthode abstraite GetRemoteAddress()
de HttpWorkerRequest
qui est utilisé en interne par HttpRequest.UserHostAddress
.
IIS7HttpWorkerRequest
sait que REMOTE_ADDR
est la propriété IIS qu'il doit lire et, après avoir traversé quelques couches d'abstraction supplémentaires tout en faisant le tour du contexte de la demande, tout se termine enfin par l'appel MgdGetServerVariableW(IntPtr pHandler, string pszVarName, out IntPtr ppBuffer, out int pcchBufferSize);
dans WebEngine.dll qui écrit simplement une chaîne de longueur pcchBufferSize
dans ppBuffer
contenant les mêmes choses que vous obtenez HttpRequest.UserHostAddress
.
Comme je doute qu'il y ait d'autres pièces dans le HTTPContext qui reçoivent des informations liées à la demande de la demande Fed, je suppose que vous devrez continuer à faire votre propre magie pour la conversion pour laquelle il y a beaucoup d'idées dans le lien que j'ai publié dans le commentaires.