أسرع طريقة للحصول على القيمة العددية لعنوان IP الخاص بالطلب في ASP.NET
سؤال
ما هي أسرع طريقة للحصول على التنسيق الرقمي (ليس تنسيق السلسلة) من العميل؟
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.
هل انا مخطئ؟
المحلول
لا يبدو أن 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 تحصل على معلومات متعلقة بمرسل الطلب، أفترض أنه سيتعين عليك الاستمرار في القيام بالسحر الخاص بك للتحويل والذي يوجد الكثير من الأفكار له في الرابط الذي نشرته في تعليقات.