Как предотвратить перезапуск приложения ASP.NET при изменении web.config? - PullRequest
31 голосов
/ 05 марта 2009

Хостинг ASP.NET выполняется методом ApplicationHost.CreateApplicationHost. Когда я изменяю web.config во время работы приложения, я вижу много брошенных ThreadAbortException первого шанса. Это как раз перед тем, как мое приложение падает. Я предполагаю, что это потому, что среда выполнения обнаружила изменения в конфигурации и хочет перезапустить.

Для нас этот сценарий не поддерживается, поэтому я бы предпочел отключить автоматическую перезагрузку.

Кто-нибудь знает, как это сделать?

Ответы [ 5 ]

26 голосов
/ 05 марта 2009

Насколько мне известно, нет способа отключить это поведение, изменения в webconfig заставляют приложение перезапускаться.

Обновление: это действительно возможно, есть ряд методов, хорошо документированных, как объяснено в этом ответе *

Оригинальный ответ:

Есть похожий вопрос здесь только для другой справки. Я нашел дополнительную информацию, которая может оказаться полезной.

Изменения конфигурации вызывают перезапуск домена приложения
Изменения в настройки конфигурации в Web.config файлы косвенно вызывают приложение домен для перезагрузки. Это поведение происходит по замыслу. Вы можете по желанию используйте атрибут configSource для ссылки на внешние файлы конфигурации которые не вызывают перезапуск, когда изменение сделано. Для дополнительной информации, см. configSource в Общие атрибуты Наследуется элементами Section.

С Эта статья MSDN

* Отказ от ответственности: я написал другой ответ и, как правило, не делаю ссылки на себя, но считаю, что это достаточно актуально, чтобы ссылаться здесь, так как через 8 лет после этого поста это действительно совсем другое: решение очень легко щелкнув интерфейс IIS, и существуют обходные пути, начиная с ASP.NET 1.0.

23 голосов
/ 17 июля 2015

На самом деле, первые два ответа неверны. возможно и достаточно просто , чтобы предотвратить эту переработку, и эта функция была доступна, по крайней мере, с IIS6.

Метод 1 (для всей системы)

Измените параметр реестра DWORD для HKLM\SOFTWARE\Wow6432Node\Microsoft\ASP.NET\FCNMode на значение 1, что отключит все уведомления об изменении файла.

Не смущайтесь местоположением: Wow6432Node в этом случае не влияет на разрядность вашего веб-приложения.

Метод 2 (.NET 4.5 +)

Если вы используете .NET 4.5, тогда теперь можно отключить это на уровне сайта , просто используйте следующее в web.config:

<httpRuntime fcnMode="Disabled"/> 

Метод 3 (IIS6 +)

Наконец, а также (по крайней мере), начиная с IIS6, есть параметр, называемый DisallowRotationOnConfigChange, как параметр только для пула приложений (по крайней мере, я думаю, что текст в MSDN пытается это сделать) говорят, но я не проверял это). Установите для него значение true, и изменения в конфигурации пула приложений не приведут к немедленной перезагрузке.

Этот последний параметр также можно установить в разделе «Дополнительные параметры» пула приложений:

Disable Recycling for Configuration Change

Метод 4 (ASP.NET 1.0 и 1.1)

Для (старых) веб-сайтов, использующих ASP.NET 1.0 или 1.1, существует подтвержденная ошибка , которая может вызывать быстрые и повторные повторы при изменении файла. Обходной путь в то время был похож на то, что MartinHN предложил по основному вопросу, а именно что-то вроде следующего в вашем web.config:

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

Это не отключает утилизацию, но делает это только после выполнения 5000 перекомпиляций. Полезность этого числа зависит от размера вашего приложения. Microsoft не совсем ясно, что такое перекомпиляция на самом деле. Однако по умолчанию установлено значение 15 .

В качестве отступления: независимо от версии .NET или Windows, мы обнаруживаем, что когда приложение запускается из общего ресурса и используется в среде с балансировкой нагрузки, сайт постоянно перезагружается. Единственный способ решить эту проблему - добавить эту настройку FNCMode в реестр (но теперь есть более детальные опции).

20 голосов
/ 10 марта 2009

Я столкнулся с еще большей проблемой в том же духе - изменения в любом файле или подпапке в базовом каталоге AppDomain приводят к закрытию среды размещения. Это довольно большая проблема для нашего приложения, поскольку мы запускаем пользовательский интерфейс WPF в том же домене приложений, и мы не можем перезапустить его, не мешая работе пользователя.

Я действительно хотел избежать запуска отдельного AppDomain для веб-части приложения, поэтому я покопался в Reflector. Я обнаружил, что виновником был внутренний класс 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);
    }
}
9 голосов
/ 24 августа 2009

Решением было бы добавить следующий элемент в раздел web.config:

<httpRuntime
    waitChangeNotification="315360000"
    maxWaitChangeNotification="315360000"
/>
0 голосов
/ 10 декабря 2009

Как упомянуто jfburdet, решение состоит в том, чтобы использовать waitChangeNotification и maxWaitChangeNotification.

При этом вы должны знать, что они не работают на IIS 7, если ASP.NET работает в смешанном режиме: http://forums.iis.net/t/1149344.aspx

...