web.config가 수정 될 때 ASP.NET 응용 프로그램이 다시 시작되는 것을 방지하는 방법은 무엇입니까?

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

문제

나는 thep.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 애플리케이션 풀의 구성 변경으로 인해 즉각적인 재활용이 발생하지 않습니다.

이 마지막 설정은 응용 프로그램 풀의 고급 설정에서 설정할 수도 있습니다.

Disable Recycling for Configuration Change

방법 4 (ASP.NET 1.0 및 1.1)

ASP.NET 1.0 또는 1.1을 사용하는 (기존) 웹 사이트의 경우 확인 된 버그가 있습니다 이는 파일 변경에 빠르고 반복되는 재활용을 유발할 수 있습니다. 당시의 해결 방법은 무엇과 비슷했습니다 마틴 주요 질문, 즉 다음과 같은 것과 같은 web.config:

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

이것은 재활용을 비활성화하지 않지만 그 이후에만 그렇게합니다. 5000 재 컴파일이 이루어졌습니다. 이 번호가 유용한 지 여부는 응용 프로그램의 크기에 따라 다릅니다. Microsoft는 무엇을 말하지 않습니다 재 컴파일 정말로. 그러나 기본값은 다음과 같습니다 15.

여담으로: .NET 또는 Windows 버전에 관계없이 응용 프로그램이 공유에서 실행되고 하중 균형 환경에서 사용되면 사이트가 지속적으로 재활용되는 것을 발견합니다. 그것을 해결하는 유일한 방법은 FNCMode 레지스트리로 설정합니다 (그러나 이제는 더 세밀한 옵션이 있습니다).

나는 같은 선을 따라 더 큰 문제를 겪었다 - 변화가 어느 AppDomain Base Directory의 파일 또는 서브 폴더는 호스팅 환경이 종료됩니다. 동일한 appDomain에서 WPF UI를 실행하므로 응용 프로그램에 큰 문제가 있으며 사용자에게 학살하지 않고는 다시 시작할 수 없습니다.

나는 응용 프로그램의 웹 기반 부분에 대해 별도의 앱 도메인을 실행하지 않기를 원했기 때문에 반사판으로 파기를했습니다. 나는 범인이 내부 계급이라는 것을 알았습니다 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을 사용하는 것입니다.

즉, ASP.NET이 혼합 모드로 실행되면 IIS 7에서 작동하지 않는다는 것을 알아야합니다. http://forums.iis.net/t/1149344.aspx

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top