أسرع طريقة للحصول على القيمة العددية لعنوان IP الخاص بالطلب في ASP.NET

StackOverflow https://stackoverflow.com/questions/6383997

  •  28-10-2019
  •  | 
  •  

سؤال

ما هي أسرع طريقة للحصول على التنسيق الرقمي (ليس تنسيق السلسلة) من العميل؟

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

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top