문제

Global.asax에서 재활용 이벤트를 잡을 수 있습니까?

Application_end가 트리거 될 것이지만 응용 프로그램 풀의 재활용에 의해 트리거되었음을 알 수있는 방법이 있습니까?

thx, Lieven Cardoen 일명 Johlero

도움이 되었습니까?

해결책

그래서 여기에 이것이 어떻게 작동 할 수 있는지 아이디어가 있습니다.

이전 답변 (AppDomain.currentDomain.processexit에 첨부) 및 스테프부댓글 :

이것은 대부분의 구조화 된 프로세스 파열을 포획 할 것이지만, 나는 그것이 모든 흡입을 포획 할 것이라고 확신하지 못한다. 예를 들어 http://blogs.msdn.com/jmstall/archive/2006/11/26/process-exit-event.aspx프로세스 재활용은 매달린 것처럼 보이면 프로세스를 죽일 것입니다. 핸들러가 호출되지 않을 것입니다.

나는 다음과 같은 전략을 제안한다 :

(일반) ProcessExit 핸들러 (응용 프로그램 풀 재활용에서 호출되지 않는다고 가정 함)에서 디스크에 파일을 작성하십시오. "app_domain_end_ok.tmp".

그런 다음 Global.asax의 application_start 에서이 파일을 확인하십시오. 그것이 존재하지 않는 경우, 응용 프로그램이 깨끗한 방식으로 종료되지 않았거나 처음 시작한 것은 신호입니다. 수표 후 디스크 에서이 파일을 삭제하는 것을 잊지 마십시오.

나는 그것을 직접 시도하지 않았지만 시도해 볼 가치가있을 수 있습니다.

다른 팁

이 기사를 찾았습니다 Scott Guthries의 블로그:

ASP.NET 응용 프로그램 종료 이벤트 로깅

Listserv의 누군가가 최근 ASP.NET이 애플리케이션 도메인을 다시 시작하는 이유와시기를 파악할 수있는 방법이 있는지 물었습니다. 구체적으로, 그는 프로덕션 공유 호스팅 환경에서 자신의 응용 프로그램에서 트리거되는 정확한 원인을 찾고있었습니다 (Web.config 파일 변경, Global.asax 변경, APP_CODE 디렉토리 변경, 디렉토리 삭제 변경, 최대 -Num 컴파일은 할당량, bin 디렉토리 변경 등)에 도달했습니다.

Thomas의 Thomas는 멋진 개인 반사 트릭을 사용 하여이 정보를 캡처하고 기록하는 멋진 코드 스냅 펫을 가지고 있습니다. 응용 프로그램을 재사용하고 추가하기가 매우 쉽고 원하는 곳에서 정보를 기록하는 데 사용될 수 있습니다 (아래 코드는 NT 이벤트 로그를 사용하여 저장하십시오. 그러나 데이터베이스 또는 데이터베이스로 쉽게 보낼 수 있습니다. 관리자에게 이메일을 통해). 코드는 ASP.NET v1.1 및 ASP.NET v2.0과 함께 작동합니다.

System.reflection.reclection.diagnostics 네임 스페이스를 Global.asax 클래스/파일에 추가 한 다음이 코드와 함께 Application_end 이벤트를 추가하기 만하면됩니다.

public void Application_End() {

    HttpRuntime runtime = 
       (HttpRuntime) typeof(System.Web.HttpRuntime).InvokeMember("_theRuntime",
          BindingFlags.NonPublic | BindingFlags.Static | BindingFlags.GetField, 
          null, null, null);

    if (runtime == null)
        return;

    string shutDownMessage = 
       (string) runtime.GetType().InvokeMember("_shutDownMessage",
           BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.GetField,
           null, runtime, null);

    string shutDownStack = 
       (string) runtime.GetType().InvokeMember("_shutDownStack",
           BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.GetField,
           null, runtime, null);

    if (!EventLog.SourceExists(".NET Runtime")) {
        EventLog.CreateEventSource(".NET Runtime", "Application");
    }

    EventLog log = new EventLog();
    log.Source = ".NET Runtime";

    log.WriteEntry(String.Format(
          "\r\n\r\n_shutDownMessage={0}\r\n\r\n_shutDownStack={1}", 
          shutDownMessage, shutDownStack),
       EventLogEntryType.Error);
}

나는 이것을 직접 시도한 적이 없지만, 당신은 이벤트 핸들러를 AppDomain의 ProcessExit 이벤트에 첨부하려고 시도 할 수 있습니다.

...
AppDomain.CurrentDomain.ProcessExit += new EventHandler(OnExit);
...

void OnExit(object sender, EventArgs e) {
    // do something
}

이게 도움이 되길 바란다!

DomainUnload 이벤트에 첨부하는 데 훨씬 더 성공적이었습니다. AppPool 재활용 및 AppPool 자체의 파업이 시작됩니다.

AppDomain.CurrentDomain.DomainUnload += this.CurrentDomainOnProcessExit;

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