본문 바로가기

IT 살이/04. 기술 - 프로그래밍

ASP.NET 웹 어플리케이션 인스턴스와 HttpModule


아래 글은 동일한 ASP.NET 웹 어플리케이션의 인스턴스가 여러개 생성될 수 있다는 것을 말하고 있다.

2015/09/06 - [04.기술-APP/웹서버] - 05. ASP.NET 웹어플리케이션-쓰레드


같은 프로세스내에서 동일한ASP.NET 웹 어플리케이션 인스턴스가 여러개 생성되어 동시에(simultaneously)된다는 것이고 이것은 ASP.NET은 하나의 프로세스내에서 여러개의 웹 어플리케이션을 멀티쓰레드로 실행하는 것을 의미할 것이다. 그래서 앞의 포스트에서는 static 변수를 사용할때 locking을 사용해야 한다고 했다. 

그리고 동일한 웹 어플리케이션의 인스턴스가 여러개 생성된다는 것은 HttpModule의 구현에도 영향을 줄 수 있다는 것을 아래 블로그가 설명하고 있다. 

 

How to correctly use IHttpModule to handle Application_OnStart event

http://erraticdev.blogspot.kr/2011/01/how-to-correctly-use-ihttpmodule-to.html


아래 코드는 ASP.NET이 제공하는 기본 IHttpModule 인터페이스이다.


public class MyHttpModule : IHttpModule

{

    public void Dispose()

    {

        throw new NotImplementedException();

    }


    public void Init(HttpApplication context)

    {

        throw new NotImplementedException();

    }


이 Http 모듈dml Init()은 은 웹 어플리케이션 인스턴스가 생성될때마다 호출된다. 만약 최초 어플리케이션 인스턴스가 생성될때 한번만 호출되기를 바란다면 자체적으로 "이전에 생성되었는지 여부"를 가지고 있는 static 변수를 사용해야 하는 방법을 사용하고 있다. 웹 어플리케이션에서 static 멤버를 사용하려면 앞에서 말한대로 locking을 사용해야 한다.


 public class MyHttpModule : IHttpModule

{

    #region Static privates

    private static volatile bool applicationStarted = false;

    private static object applicationStartLock = new object();

    #endregion


    #region IHttpModule implementation


    /// <summary>

    /// Disposes of the resources (other than memory) used by the module that implements <see cref="T:System.Web.IHttpModule"/>.

    /// </summary>

    public void Dispose()

    {

        // dispose any resources if needed

    }


    /// <summary>

    /// Initializes the specified module.

    /// </summary>

    /// <param name="context">The application context that instantiated and will be running this module.</param>

    public void Init(HttpApplication context)

    {

        if (!applicationStarted)

        {

            lock (applicationStartLock)

            {

                if (!applicationStarted)

                {

                    // this will run only once per application start

                    this.OnStart(context);

                    applicationStarted = true;

                }

            }

        }

        // this will run on every HttpApplication initialization in the application pool

        this.OnInit(context);

    }


    #endregion


    /// <summary>Initializes any data/resources on application start.</summary>

    /// <param name="context">The application context that instantiated and will be running this module.</param>

    public virtual void OnStart(HttpApplication context)

    {

        // put your application start code here

        // 이곳에 최초의 어플리케이션 인스턴스가 생성될때

        // 한번만 실행되기를 바라는 코드를 넣는다. 

    }


    /// <summary>Initializes any data/resources on HTTP module start.</summary>

    /// <param name="context">The application context that instantiated and will be running this module.</param>

    public virtual void OnInit(HttpApplication context)

    {

        // put your module initialization code here

        // 이곳에 어플리케이션의 모든 인스턴스가 생성될때마다 실행되기를 바라는 코드를 넣는다.

    }

}


'IT 살이 > 04. 기술 - 프로그래밍' 카테고리의 다른 글

ClickOnce SHA2기반 코드 사인  (0) 2016.06.01
C#, yield return  (0) 2016.01.19
log4net 정리 & 예제  (1) 2016.01.19