나는 다음과 같은 내 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 요청을 설정하고 빠르게 연속해서 해고하면 다음과 같은 메시지가 나타납니다.
붉은 색은 스레딩과 관련된 여러 가지 오류입니다.
내 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에서