在ASP.NET中获取请求的IP地址的数值的最快方法

时间:2011-06-17 09:44:12

标签: asp.net client ip uint

获取客户的数字格式(不是格式)的最快方法是什么?

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 个答案:

答案 0 :(得分:1)

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属性,在传递请求上下文后经过几层抽象之后,它最终都以调用{{1}结束在webengine.dll中,它只是将一个长度为MgdGetServerVariableW(IntPtr pHandler, string pszVarName, out IntPtr ppBuffer, out int pcchBufferSize);的字符串写入pcchBufferSize,其中包含您从ppBuffer获得的相同内容。

由于我怀疑HttpContext中还有其他部分可以获取请求发送者相关信息,我假设您必须继续为转换做出自己的魔力,因为链接中有很多想法张贴在评论中。