Как предотвратить ASP.NET перезапуск приложения при работе в интернете.конфиг изменен?

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

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

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

5 ответов


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

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

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

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

изменения конфигурации вызывают перезапуск домена приложения
Изменения параметры конфигурации в web.конфиг файлы косвенно вызывают приложение домен для перезапуска. Такое поведение происходит по замыслу. Вы можете выборочно используйте атрибут configSource для ссылки на внешние файлы конфигурации это не вызывает перезапуска, когда изменения. За дополнительной информацией, см. В разделе configsource в общие Атрибуты Наследуется элементами раздела.

с эта статья MSDN

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


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

Я действительно хотел избежать необходимости запускать отдельный 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);
    }
}

на самом деле, первые два ответа неверны. Это и возможно и довольно легко предотвратить эту переработку, и эта функция была доступна, по крайней мере, с 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, есть настройка под названием 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 настройка реестра (но теперь есть более мелкозернистые параметры).


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

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

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

Это, как говорится, вы должны знать, что они не работают на IIS 7, Если ASP.NET запускается в смешанном режиме:http://forums.iis.net/t/1149344.aspx