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

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

Вопрос

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

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

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

Это было полезно?

Решение

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

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

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

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

  

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

Из этой статьи MSDN

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

Другие советы

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

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

Отключить переработку для изменения конфигурации

Метод 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 в реестр (но теперь есть более детальные параметры).

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top