Programming/.NET

웹애플리케이션에 Add -> Add New Item 을 선택하고 Global Application Class 를 추가하면 Global.aspx 파일이 생성됩니다. 이 파일은 웹애플리케이션에 대한 전체적인 이벤트를 처리하는 페이지입니다.

이 파일은 내부에 자동적으로 5개의 이벤트를 포함한 내용을 담고 있는데 각 이벤트에 대한 내용은 다음과 같습니다.

1. Application_Start

어떤 사용자한테라도 웹애플리케이션이 처음 호출될때 발생하는 이벤트입니다.

2. Application_End

웹애플리케이션이 종료될때 발생하는 이벤트입니다. 객체소멸등은 .NET의 가비지컬렉터가 알아서 처리하므로 개발자가 이 이벤트에 내용을 추가할일은 거의 없습니다.

3. Application_Error

웹애플리케이션에서 에러가 발생할때 호출되는 이벤트입니다. 특정 오류내용에 대한 로그기록이나 관리자에게 메일을 보내는등의 처리를 하기에 알맞은 이벤트입니다.

4. Session_Start

Application_Start는 웹애플리케이션의 시작이므로 사용자 구분없이 웹애프리케이션이 처음 호출될때의 이벤트를 처리하지만 Session은 사용자마다 고유하므로 Session_Start 이벤트는 각 사용자마다 웹애플리케이션을 처음 호출할때 발생하는 이벤트입니다.

5. Session_End

사용자가 애플리케이션을 벗어날때 호출됩니다. 다만 세선이 InProc 모드로 동작할때여야 합니다. 이 말은 모든 세션이 서버의 메모리에 저장되어야 함을 의미합니다.

6. Application_BeginRequest

직접 작성해야 하는 이벤트로서 서버에 웹애플리케이션에 대한 특정 요청이 들어와 수행되기 직전에 발생하는 이벤트입니다.

7. Application_AuthenticateRequest

직접 작성해야 하는 이벤트로서 웹애플리케이션에 대한 요청이 들어올때마다 발생하며 이때 사용자 정의 인증처리를 수행할 수 있습니다.

아래 코드1-1은 사용자로부터 애플리케이션이 요청될때 서버에 로그기록을 남기는 예시입니다.
    void Session_Start(object sender, EventArgs e) 
    {
        // Code that runs when a new session is started
        if (!System.Diagnostics.EventLog.SourceExists(".NET Runtime"))
        {
            System.Diagnostics.EventLog.CreateEventSource(".NET Runtime", "Application");
            return;
        }

        System.Diagnostics.EventLog web_log = new System.Diagnostics.EventLog();         web_log.Source = ".NET Runtime";         web_log.WriteEntry("페이지 요청됨", System.Diagnostics.EventLogEntryType.Information);     }

<코드1-1>


참고로 .NET Runtime 은 Application 이벤트로그에 이벤트를 기록하는 원본(souce)입니다. 만약 다른 원본으로 이벤트를 기록하고자 한다면 서버 레지스트리의 HKEY_LOCALMACHINE\SYSTEM\CurrentControlSet\services\eventlog\Application 을 참고하시기 바랍니다. 하위키로 해당 Application에 로그를 남기는 요청자가 나열되어 있습니다.

만약 새로은 요청자를 써야 한다면 하위에 해당 요청자이름으로 키를 생성하시면 됩니다.

Web Application이 예기치 않게 종료되는 경우 예외기록은 다음 예제를 참고해 주세요.
HttpRuntime runtime = (HttpRuntime)typeof(System.Web.HttpRuntime).InvokeMember("_theRuntime", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Static | System.Reflection.BindingFlags.GetField, null, null, null);

if (runtime == null)
    return;

string errorMesage = (string)runtime.GetType().InvokeMember("_shutDownMember", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.GetField, null, null, null);
string errorStatck = (string)runtime.GetType().InvokeMember("_shutDownStatck", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.GetField, null, null, null);

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

EventLog web_log = new EventLog();
web_log.Source = ".NET Runtime";
web_log.WriteEntry(string.Format("errorMessage={0}\r\n\r\n_errorStack={1}", errorMesage, errorStatck), EventLogEntryType.Error);
Application 종료 상황이므로 _shutDownMember 와 _shutDownStatck 으로 관련 오류내용을 가져와 web_log 객체를 이용해 .NET Runtime 소스에 오류내용을 기록합니다.

'Programming > .NET' 카테고리의 다른 글

[ASP.NET] RequestFieldValidator  (0) 2014.02.05
[ASP.NET] MultiView 와 View  (0) 2014.02.04
[ASP.NET] Global.aspx  (0) 2014.02.03
[ASP.NET] Chart  (0) 2014.01.27
[ASP.NET] BulletedList  (0) 2014.01.23
[ASP.NET] 서버컨트롤 (Server Controls)  (0) 2014.01.21
0 0