Самый быстрый способ получить числовое значение IP-адреса запроса в ASP.NET - PullRequest
0 голосов
/ 17 июня 2011

Какой самый быстрый способ получить числовой формат ( НЕ ФОРМАТ СТРОНЫ ) клиента?

string format  : 223.255.254.0
numeric format : 3758095872

Я могу вычислить это с помощью некоторого кода, например

    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;
    }

на основе строки Request.UserHostAddress, но я надеялся, что IIS или ASP.NET предварительно это вычисляют, и она где-то скрыта в HttpContext.

Я не прав?

1 Ответ

1 голос
/ 17 июня 2011

HttpContext, кажется, не делает больше магии, чем то, что вы уже видите: строковое значение в HttpRequest.UserHostAddress

Некоторая справочная информация:

HttpContext.Current.Request имеет тип System.Web.HttpRequest, который принимает System.Web.HttpWorkerRequest в качестве параметра при создании экземпляра.

HttpWorkerRequest - это абстрактный класс, созданный посредством реализации хостинга, например, в случае IIS System.Web.Hosting.IIS7WorkerRequest, который затем реализуетабстрактный метод GetRemoteAddress() из HttpWorkerRequest, который используется внутри HttpRequest.UserHostAddress.

IIS7HttpWorkerRequest, знает, что REMOTE_ADDR - это свойство IIS, которое необходимо прочитать, и, пройдя еще несколько слоевАбстракция во время передачи контекста запроса, все это в конечном итоге заканчивается вызовом MgdGetServerVariableW(IntPtr pHandler, string pszVarName, out IntPtr ppBuffer, out int pcchBufferSize); в webengine.dll, который просто записывает строку длины pcchBufferSize в ppBuffer, содержащую то же самое, что вы получаете из HttpRequest.UserHostAddress.

Так как я сомневаюсь, что в HttpContext есть другие части, которые получают информацию, связанную с отправителем запроса, я предполагаю, что вам придется продолжать делать свое собственное волшебство для преобразования, для которого есть pмножество идей в ссылке, которую я разместил в комментариях.

...