سؤال

هل من الممكن للقبض على حدث المهملات في global.asax؟

وأنا أعلم وسيتم تشغيل Application_End ولكن هناك طريقة لمعرفة أن تم تشغيله من قبل إعادة تدوير تجمع التطبيقات؟

وتشك ليفن كاردوين الملقب Johlero

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

المحلول

وهكذا، وهنا هو فكرة كيف يمكن أن ينجح.

واستنادا إلى بلدي الإجابة السابقة (ونعلق على AppDomain.CurrentDomain.ProcessExit) و <ل أ href = "https://stackoverflow.com/users/12702/stephbu"> الصورة stephbu تعليق:

<اقتباس فقرة>   

وهذه الإرادة فخ عملية أكثر تنظيما   teardowns على سبيل المثال - ولكن لست متأكدا من أن   وسوف فخ جميع هبوطا المسيل للدموع. مثلا    http://blogs.msdn.com/ jmstall / أرشيف / 2006/11/26 / عملية خروج event.aspx   وعملية إعادة تدوير قتل عملية   إذا كان يبدو لتكون معلقة - معالج الخاص بك   لن الحصول على استدعاء.

وأقترح الاستراتيجية التالية:

في معالج (العادية) ProcessExit (الذي نفترض سوف لا يتم استدعاء على إعادة تدوير تجمع التطبيقات)، وكتابة بعض الملفات إلى القرص مثل "app_domain_end_ok.tmp".

وبعد ذلك في Application_Start من الاختيار global.asax لهذا الملف. إذا لم يكن موجودا بل هو علامة على أن لم يكن إنهاء التطبيق بطريقة نظيفة (أو أن هذه هي المرة الأولى على الإطلاق أنها بدأت). لا تنسى أن حذف هذا الملف من القرص بعد الاختيار.

وأنا لم يحاول أن نفسي، ولكن يمكن أن يكون يستحق المحاولة.

نصائح أخرى

ولقد وجدت هذه المادة على <قوية> بلوق سكوت Guthries ل: ل

على تسجيل ASP.NET تطبيق إيقاف الأحداث

<اقتباس فقرة>   

وشخص ما على خادم القوائم طلبت مؤخرا   إذا كان هناك طريقة لمعرفة   لماذا وعند إعادة تشغيل ASP.NET   مجالات التطبيق. على وجه التحديد، وقال انه   كان يبحث عن السبب الدقيق لل   ما حثهم على بلده   التطبيق في إنتاج مشترك   بيئة مستضافة (كان ل   تغيير ملف web.config، وglobal.asax   التغيير، تغيير الدليل app_code،   دليل حذف التغيير،   وصلت الحد الأقصى-الأسطوانات-تجميع الحصص،   \ تغيير الدليل بن، الخ).

     

وتوماس على زملائي في الفريق لديه بارد   رمز مقتطف أنه كتب أن الاستخدامات   بعض الحيل أنيق انعكاس خاصة   لالتقاط وتسجيل هذه المعلومات.   فمن السهل جدا لإعادة استخدام وإضافة   في أي تطبيق، ويمكن استخدامها   لتسجيل المعلومات في أي مكان كنت   تريد (رمز أدناه استخدام الحدث NT   تسجيل الدخول لحفظه - ولكن هل يمكن أن تماما كما   إرسال بسهولة إلى قاعدة بيانات أو عن طريق   البريد الإلكتروني إلى مشرف). أعمال كود   مع كل V1.1 ASP.NET وASP.NET   V2.0.

     

وببساطة إضافة System.Reflection و   بمساحات System.Diagnostics إلى حسابك   Global.asax الطبقة / الملف، وإضافة ثم   الحدث Application_End مع هذا   كود:

public void Application_End() {

    HttpRuntime runtime = 
       (HttpRuntime) typeof(System.Web.HttpRuntime).InvokeMember("_theRuntime",
          BindingFlags.NonPublic | BindingFlags.Static | BindingFlags.GetField, 
          null, null, null);

    if (runtime == null)
        return;

    string shutDownMessage = 
       (string) runtime.GetType().InvokeMember("_shutDownMessage",
           BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.GetField,
           null, runtime, null);

    string shutDownStack = 
       (string) runtime.GetType().InvokeMember("_shutDownStack",
           BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.GetField,
           null, runtime, null);

    if (!EventLog.SourceExists(".NET Runtime")) {
        EventLog.CreateEventSource(".NET Runtime", "Application");
    }

    EventLog log = new EventLog();
    log.Source = ".NET Runtime";

    log.WriteEntry(String.Format(
          "\r\n\r\n_shutDownMessage={0}\r\n\r\n_shutDownStack={1}", 
          shutDownMessage, shutDownStack),
       EventLogEntryType.Error);
}

ولم يسبق لي ان جربت هذا بنفسي، ولكن هل يمكن أن تحاول إرفاق معالج الحدث إلى الحدث ProcessExit من في AppDomain.

...
AppDomain.CurrentDomain.ProcessExit += new EventHandler(OnExit);
...

void OnExit(object sender, EventArgs e) {
    // do something
}

آمل أن يساعد هذا!

وكنت أكثر نجاحا بكثير مع إرفاق الحدث DomainUnload، يتم تشغيل على AppPool إعادة تدوير والمحتسب بدل الضائع للAppPool نفسها.

وAppDomain.CurrentDomain.DomainUnload += this.CurrentDomainOnProcessExit;

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