2014-04-16 6 views
0

asp.net 응용 프로그램 개발에 대한 경험이 없습니다.모든 새 스레드에 대해 HttpModule Init() 메서드 호출을 강제하는 방법

SxS 등록이 필요없는 Componente COM을 사용하는 웹 응용 프로그램을 개발하고 싶습니다.

MSDN Article, Http Module 다음 그 인쇄 스레드 ID HttpModule을에게

public class SyncModule : IHttpModule 
{  
    private MyEventHandler _eventHandler = null; 

    public void Init(HttpApplication app) 
    { 
     app.BeginRequest += new EventHandler(OnBeginRequest); 

// Code that enable COM SxS registration-free 
     EnableSxSForThisThread_with_CreateActCtx(); 

     int id = System.Threading.Thread.CurrentThread.ManagedThreadId; 
     Debug.WriteLine("MyModule Thread Id: " + id); 
    } 

    public void Dispose() { } 

    public delegate void MyEventHandler(Object s, EventArgs e); 

    public event MyEventHandler MyEvent 
    { 
     add { _eventHandler += value; } 
     remove { _eventHandler -= value; } 
    } 

    public void OnBeginRequest(Object s, EventArgs e) 
    { 
     HttpApplication app = s as HttpApplication; 
     int id = System.Threading.Thread.CurrentThread.ManagedThreadId; 
     Debug.WriteLine("OnBeginRequest Thread Id: " + id); 
     Debug.WriteLine("OnBeginRequest: Hello from OnBeginRequest in custom module.<br>"); 
     if (_eventHandler != null) 
      _eventHandler(this, null); 
    } 

공지 사항을 구현했습니다.

public void Init(HttpApplication app) 
{ 
... 
    int id = System.Threading.Thread.CurrentThread.ManagedThreadId; 
    Debug.WriteLine("MyModule Thread Id: " + id); 
} 

그리고 나는 내 웹 응용 프로그램이 퍼팅과 연결이 내부 'Web.confg'

<httpModules> 
    <add name="MyModule" type="MyModule.SyncModule, MyModule" /> 
</httpModules> 

하지만 같은 스레드에 대한, 내 웹 응용 프로그램을 실행하고 나는 성공과 componente의 COM을 호출 할 수 있습니다 HttpModule Init을 실행합니다.

단추를 클릭하여 다시 실행하면 COM을 사용하는 스레드가 변경되고 HttpModule Init()가 호출되지 않아 실패합니다.

Init() 및 CreateActCtx를 올바르게 호출하는 새로운 스레드를 모두 감지하는 방법은 무엇입니까? 가능합니까?

답변

0

이와 같이 [ThreadStatic] 속성으로 장식 된 부울 플래그를 사용해보십시오.

[ThreadStatic] 
static bool _hasInitBeenCalled; 

모든 이벤트에서 해당 플래그가 true인지 확인하십시오. 그렇지 않으면 init 코드를 실행 한 다음 플래그를 true로 설정하십시오. 변수는 본질적으로 모든 스레드마다 고유합니다.

+0

이 항목과 ObjectToEnabledSxS를 HttpModule 클래스 속성으로 추가하려고했습니다. 시작시 스레드 ID 5와 10이 초기화되고 스레드 ID 2가 스레드 ID 5로 초기화 된 ObjectToEnabledSxS의 Dispose()를 호출합니다. 스레드 ID를 얻기 위해 System.Threading.Thread.CurrentThread.ManagedThreadId를 사용하고 있습니다. 어쩌면 HttpModule이 죽고 GC가 Dispose()를 호출할까요? – Cobaia

+0

내 ObjectToEnableSxS는 활성화 된 특정 활성화 컨텍스트를 고유하게 식별하는 쿠키를 반환하는 ActivateActCtx를 호출합니다. 스레드 ID 5와 10은 쿠키에 대해 동일한 값을 반환합니다. ActivateActCtx http://msdn.microsoft.com/en-us/library/aa374151(v=vs.85).aspx – Cobaia