아래 글은 동일한 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
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 |