سؤال

أحصل على هذا الاستثناء عندما أحاول الوصول إلى كائن httpcontext.current.request.

لقد رأيت الردود في L1, L2 و L3 ... إذن ... سؤالي إذن:

لما هو في العالم الآن؟

أردت تطوير وحدة نمطية يتم ضربها في كل مرة يتم فيها إدخال مكالمة إلى موقع الويب ، حتى أتمكن من تسجيل عنوان URL الذي تم الوصول إليه ، وعنوان IP للمستخدم ، وما إلى ذلك ، ولكن يبدو أنه لا يمكنني فعل ذلك بعد الآن في IIS7. هل هناك أي عمل في الأرجاء؟ (إلى جانب التبديل إلى "الوضع الكلاسيكي").

alt text http://userserve-ak.last.fm/serve/126/24432467.jpg

هتافات.

هل كانت مفيدة؟

المحلول

متى تفعل ذلك؟ هل هو في حدث الوحدة؟ يجب أن تكون قابلة للتنفيذ تمامًا في تجمع متكامل أيضًا. الخلاصة القائمة هناك تغييرات على كيفية ربط ASP.NET إلى IIS عند التشغيل في وضع متكامل يجعلها "أكثر من الدرجة الأولى". هذا يعني أن بعض الأحداث تطلق النار من قبل ، على سبيل المثال application_start ستطلق الآن النار خارج سياق الطلب الفعلي. ومن الأمثلة الأخرى أن يكون لها هوية مصادقة على Windows في البداية ، حيث أن BeginRequest يحدث حتى قبل مصادقة IIS ، وهو ما لم يكن في الماضي.

إذا كان تطبيقك يعتمد على السلوك السيئ القديم ، فلا يزال بإمكانك تغيير AppPool لتشغيله في الوضع الكلاسيكي وسيعمل بشكل جيد.

يجب أن تكون قادرًا على الحصول على الطلب في أي إشعارات تطلب محددة مثل BeginRequest و EndRequest و PostauthorizereQuest ، إلخ. أيضًا ، أوصي بعدم استخدام httpcontext.current لأن ذلك يتحمل نظرة إضافية على طاولة التجزئة وعادة ما يمكنك ذلك احصل على السياق مباشرة بطرق أخرى ، وخاصة في سياق الوحدة النمطية ، لذلك على سبيل المثال إذا تعاملت مع BeginRequest ، فيجب أن تكون قادرًا على القيام بذلك:

    HttpApplication application = (HttpApplication)sender;  
    HttpContext context = application.Context;  

وسوف تنقذ البحث.

من وصفك ، يبدو أنك يجب أن تنفذ وحدة نمطية تتعامل مع BeginRequest و EndRequest ويجب أن تكون بخير.

نصائح أخرى

لقد نشرت هذا في الأصل كتعليق لأنه ليس إجابة حقًا ، لكنني رأيت بعد ذلك أنك تبحث عن "عمل حول" ، وهنا فكرتي في العمل.

/app_code/basepage.vb

 Public Class BasePage : Inherits System.Web.UI.Page
    Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
        ''# Do all your logging here
    End Sub
 End Class

/default.aspx.vb

Partial Class _Default : Inherits BasePage
    ''# This is simply your code behind for each page (notice it inherits BasePage)
    ''# You can still have your Page_Load events along with custom methods in here, 
    ''# and it will not affect the logging portion of your app.
End Class

في الأساس ما تفعله هو إنشاء فصل واحد يقوم بنفس العمل في كل صفحة تحميل الصفحة التي يتم تحميلها. ثم ترث كل صفحة في التطبيق الخاص بك من BasePage الفصل من أجل تفعيله.

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