web.config가 수정 될 때 ASP.NET 응용 프로그램이 다시 시작되는 것을 방지하는 방법은 무엇입니까?
-
03-07-2019 - |
문제
나는 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
애플리케이션 풀의 구성 변경으로 인해 즉각적인 재활용이 발생하지 않습니다.
이 마지막 설정은 응용 프로그램 풀의 고급 설정에서 설정할 수도 있습니다.
방법 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