2011-03-10 2 views
4

나는 다음과 같은 내 NHibernate에 세션 관리 설정을했다 :MVC 속성의 HttpContext - 스레딩 문제?

공용 클래스 TransactionAttribute : ActionFilterAttribute {

protected MvcApplication() 
    { 
     BeginRequest += delegate 
          { 
           NHibernateSessionManager.Instance.OpenSession(); 
          }; 
     EndRequest += delegate 
          { 

           NHibernateSessionManager.Instance.CloseSession(); 
          }; 
    } 

을 그리고 데이터베이스에 저장할 필요로 할 때,이 안쪽의 ActionFilterAttribute을 만들어에 대한 비공개 ITransaction _currentTransaction;

public override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
     _currentTransaction = NHibernateSessionManager.Instance.CurrentSession.Transaction; 
     _currentTransaction.Begin(); 
    } 


    public override void OnActionExecuted(ActionExecutedContext filterContext) 
    { 
     if (_currentTransaction.IsActive) 
     { 
      if (filterContext.Exception == null) 
       _currentTransaction.Commit(); 
      else 
      { 
       _currentTransaction.Rollback(); 
      } 
     } 
     _currentTransaction.Dispose(); 
    } 
} 

그런 다음 [액션]을 내 액션 메소드에 추가 할 수 있습니다. 이것은 초기 테스트에서 작동하는 것처럼 보였지만 HttpWebRequest를 사용하여 여러 앱에서 액션 메소드를 여러 번 호출 해 보았습니다. 문제가있었습니다. Fiddler로 테스트하기 POST 요청을 설정하고 빠르게 연속해서 해고하면 다음과 같은 메시지가 나타납니다. WebRequests

붉은 색은 스레딩과 관련된 여러 가지 오류입니다.

내 NHibernateSessionManager이 같은 세션 저장하는있는 HttpContext를 사용하여 고정에

public ISession CurrentSession 
    { 
     get { return (ISession)HttpContext.Current.Items["current.session"]; } 
     set { HttpContext.Current.Items["current.session"] = value; } 
    } 

그래서, 내 BeginRequest 및 EndRequest 이벤트 방법으로 내 트랜잭션 코드 이동을 - 그리고 나는 연속적으로 힙을 해고 할 수 .

제 질문은 - 왜이 문제를 해결 했습니까? 나는 내가이 비슷한 있었 것이라고 생각했을 것이다 : 요청을 시작 - 세션 OnActionExecuting을 엽니 다 - 거래 액션 코드를 시작 OnActionExecuted - 세션에게

을 닫고이 고유 될 것이라고 - 거래 종료 요청이 커밋 각각의 요청은 서로 간섭하지 않아야한다. 왜냐하면 각 요청마다 다른 HttpContext가 있어야하기 때문이다. 아니면 그들이 공유 또는 무언가 ??

누군가 나를 밝힐 수 있습니까? release notes of ASP.NET MVC 3에서

답변

5

인용구 : ASP.NET MVC 이전 버전의

는 액션 필터는 몇 가지 경우를 제외하고 요청에 따라 작성되었습니다. 이 동작은 보장 된 동작이 아니지만 단지 구현과 세부 내용 및 필터 에 대한 계약은 상태를 고려하지 않았습니다. ASP.NET MVC 3에서 필터는 적극적으로 에 캐싱됩니다. 따라서 인스턴스 상태를 부적절하게 저장하는 모든 사용자 지정 필터가 손상되었을 수 있습니다.

이것은 기본적으로 동작 필터에있는 _currentTransaction 인스턴스가 생각하는 것과 다를 수 있음을 의미합니다. 그러므로이 속성이 어떻게/언제 주입되는지주의하십시오.> 표시된 코드에서 명확하지 않습니다.