2011-06-17 66 views
0

客戶端的數字格式(不是字符串格式)的最快方法是什麼?在ASP.NET中獲取請求IP地址數值的最快方法

string format : 223.255.254.0 
numeric format : 3758095872 

我可以用一些類似的代碼基礎上Request.UserHostAddress串

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

postcompute這一點,但我希望IIS或ASP.NET預計算這個和它的某處隱藏在HttpContext的。

我錯了嗎?

+0

您可能會在http://stackoverflow.com/questions/461742/how-to-convert-an-ipv4-address-into-a-integer-in-c中獲得所有答案 – Till 2011-06-17 09:53:19

回答

1

的HttpContext似乎並沒有做任何超過魔法你已經看到:一個字符串值,在HttpRequest.UserHostAddress

一些背景資料:

HttpContext.Current.RequestSystem.Web.HttpRequest型的,這需要System.Web.HttpWorkerRequest作爲參數當實例化時。

HttpWorkerRequest是通過託管實現比如,在IIS,System.Web.Hosting.IIS7WorkerRequest的情況下,然後實現抽象方法的HttpWorkerRequestGetRemoteAddress()其內部使用HttpRequest.UserHostAddress實例化的抽象類。

IIS7HttpWorkerRequest知道REMOTE_ADDR是它需要讀取,並經歷了一個抽象幾個層,而繞過請求上下文後的IIS屬性,這一切終於在調用webengine.dll MgdGetServerVariableW(IntPtr pHandler, string pszVarName, out IntPtr ppBuffer, out int pcchBufferSize);它只是將一個字符串結束長度爲pcchBufferSize納入ppBuffer包含您從HttpRequest.UserHostAddress獲得的相同材料。

因爲我懷疑HttpContext中有其他部分獲得了與請求發送者相關的信息,我假設你將不得不繼續爲轉換做自己的魔術,因爲鏈接中有很多想法我張貼在評論中。