كيف يمكن منع إعادة تشغيل تطبيق ASP.NET عند تعديل web.config؟

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

سؤال

أنا أستضيف وقت تشغيل ASP.NET عبر ApplicationHost.CreateApplicationHost طريقة.عندما أقوم بتعديل web.config أثناء تشغيل التطبيق، أرى الكثير من الفرص الأولى ThreadAbortExceptionألقيت.هذا صحيح قبل أن ينهار طلبي.أفترض أن السبب في ذلك هو أن وقت التشغيل اكتشف تغييرات في التكوين ويريد إعادة التشغيل.

هذا ليس سيناريو مدعومًا حقًا بالنسبة لنا، لذا أفضل أن أتمكن من إيقاف تشغيل إعادة التحميل التلقائي.

لا أحد يعرف كيفية القيام بذلك؟

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

المحلول

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

تحديث:فمن الممكن في الواقع، وهناك عدد من الأساليب، موثقة جيدا، مثل وأوضح في هذه الإجابة*

الإجابة الأصلية:

هناك سؤال مماثل هنا فقط للإشارة الأخرى.لقد وجدت معلومات إضافية قد تكون مفيدة.

تتسبب تغييرات التكوين في إعادة تشغيل مجال التطبيق
التغييرات في إعدادات التكوين في ملفات web.config تسبب بشكل غير مباشر إعادة تشغيل مجال التطبيق.يحدث هذا السلوك عن طريق التصميم.يمكنك اختياريا استخدام سمة configsource للإشارة إلى ملفات التكوين الخارجية التي لا تتسبب في إعادة تشغيل عند إجراء تغيير.لمزيد من المعلومات ، راجع configsource في السمات العامة الموروثة حسب عناصر القسم.

من مقالة MSDN هذه

* تنصل:لقد كتبت الإجابة الأخرى وعادةً لا أقوم بمرجع ذاتي، ولكن أجد أنها ذات صلة بما يكفي للربط هنا منذ 8 سنوات بعد هذا المنشور، الأمر مختلف تمامًا:الحل سهل للغاية من خلال النقر على واجهة IIS الأمامية، وتوجد حلول بديلة منذ ASP.NET 1.0.

نصائح أخرى

والواقع، والأجوبة الأولين غير صحيحة. أنه هو ممكن، وسهلة جدا، لمنع هذا من الحدوث إعادة التدوير، وكانت هذه الميزة متوفرة منذ IIS6 على الأقل.

الأسلوب 1 (نظام اسعة)

وتغيير إعداد التسجيل DWORD لHKLM\SOFTWARE\Wow6432Node\Microsoft\ASP.NET\FCNMode إلى 1 القيمة، التي سيتم تعطيل <م> جميع إعلامات تغيير الملف.

لا ينبغي الخلط الموقع: Wow6432Node لديها، في هذه الحالة، أي تأثير على bitness من تطبيق الويب الخاص بك

الطريقة 2 (.NET 4.5 +)

إذا كنت تستخدم. NET 4.5، ثم أصبح من الممكن الآن لتعطيل هذا على لكل موقع مستوى أو ببساطة استخدام التالية في web.config الخاص بك:

<httpRuntime fcnMode="Disabled"/> 

الطريقة 3 (IIS6 +)

وأخيرا، وأيضا (على الأقل) حولها منذ IIS6، <وأ href = "https://msdn.microsoft.com/en-us/library/ms525764٪28v=vs.90٪29.aspx" يختلط = "noreferrer"> هناك إعداد يسمى DisallowRotationOnConfigChange كإعداد لتجمع التطبيقات فقط (على الأقل هذا ما أعتقد أن النص على MSDN يحاول أن أقول، لكني لم نجرب ذلك). تعيين إلى true وسوف تغييرات على تكوين تجمع التطبيقات لا يؤدي إلى إعادة تدوير المباشرة.

ويمكن أيضا أن يتم تعيين هذا الإعداد الأخير من إعدادات متقدمة تجمع التطبيقات:

طريقة 4 (ASP.NET 1.0 و 1.1)

لمواقع (القديمة) باستخدام ASP.NET 1.0 أو 1.1، هناك خلل أكد التي يمكن أن تسبب السريع والمتكرر بتدوير على تغييرات الملف. وكان الحل في ذلك الوقت على غرار ما MartinHN اقترح تحت السؤال الرئيسي، أي شيء من هذا القبيل ما يلي في web.config الخاص بك:

<compilation 
   debug="false"
   defaultLanguage="vb"
   numRecompilesBeforeAppRestart="5000">

وهذا لا تعطيل إعادة التدوير، لكنه لا يفعل ذلك إلا بعد <م> 5000 مكان اتخذت recompilations. إذا كان هذا الرقم هو مفيد يعتمد على حجم الطلب. Microsoft لا نقول بوضوح ما <م> إعادة تجميع هو حقا. الافتراضي، ومع ذلك، هو 15 .

بوصفها جانبا: بغض النظر عن إصدار .NET أو ويندوز، نجد أنه عندما يتم تشغيل التطبيق من مشاركة واستخدامها في بيئة موازنة التحميل، أن الموقع بتدوير باستمرار. الطريقة الوحيدة لحلها وذلك بإضافة هذا الإعداد FNCMode إلى التسجيل (ولكن الآن هناك خيارات أكثر غرامة الحبيبات).

وركضت في لمشكلة أكبر على نفس المنوال - التغييرات إلى <م> أي ملف أو مجلد فرعي في الدليل قاعدة AppDomain تتسبب في بيئة استضافة لإيقاف. هذه قضية كبيرة جدا لطلبنا ونحن تقوم بتشغيل UI WPF في نفس AppDomain ونحن لا نستطيع إعادة تشغيله دون distruptive للمستخدم.

وأردت حقا أن تجنب الاضطرار إلى تشغيل AppDomain منفصلة عن الجزء على شبكة الإنترنت من التطبيق بحيث فعلت بعض الحفر مع العاكس. لقد وجدت أن الجاني كان FileChangesMonitor الطبقة الداخلية.

وهكذا كتبت تأملا فظيع فظيع الإختراق لحل المشكلة. اعتقدت أن وظيفة هنا كحل محتمل للأي شخص آخر لها نفس المشكلة. تحتاج فقط إلى الاتصال HttpInternals.StopFileMonitoring() لتعطيل إيقاف التشغيل على التغييرات ملف / مجلد.

internal static class HttpInternals
{
    private static readonly FieldInfo s_TheRuntime = typeof(HttpRuntime).GetField("_theRuntime", BindingFlags.NonPublic | BindingFlags.Static);

    private static readonly FieldInfo s_FileChangesMonitor = typeof(HttpRuntime).GetField("_fcm", BindingFlags.NonPublic | BindingFlags.Instance);
    private static readonly MethodInfo s_FileChangesMonitorStop = s_FileChangesMonitor.FieldType.GetMethod("Stop", BindingFlags.NonPublic | BindingFlags.Instance);

    private static object HttpRuntime
    {
        get
        {
            return s_TheRuntime.GetValue(null);
        }
    }

    private static object FileChangesMonitor
    {
        get
        {
            return s_FileChangesMonitor.GetValue(HttpRuntime);
        }
    }

    public static void StopFileMonitoring()
    {
        s_FileChangesMonitorStop.Invoke(FileChangesMonitor, null);
    }
}

والحل سيكون إضافة العنصر التالي إلى القسم الملف web.config:

<httpRuntime
    waitChangeNotification="315360000"
    maxWaitChangeNotification="315360000"
/>

وكما ذكر jfburdet الحل هو استخدام waitChangeNotification وmaxWaitChangeNotification.

وأن يقال، ويجب أن نعرف أنها لا تعمل على IIS 7 إذا تم تشغيل ASP.NET في وضع مختلط: <لأ href = "http://forums.iis.net/t/1149344.aspx" يختلط = "نوفولو noreferrer"> http://forums.iis.net/t/1149344.aspx

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