2017-04-13 3 views
1

요청 필터에 나중에 서비스에서 액세스 할 수있는 사용자 지정 세션의 일부 속성을 설정하고 있습니다. 이것은 예상대로 작동합니다.서비스 외부에서 세션에 액세스하면 중복이 발생합니다.

요청 필터 : 내 서비스에서

public sealed class CustomAttribute:RequestFilterAttribute 
{ 

    public override void Execute(IRequest req, IResponse res, object requestDto) 
    { 
     var session = req.SessionAs<CustomSession>(); 

     if (!session.FromToken) 
     { 
      throw new AuthenticationException("Please authenticate using bearer token or with flag 'UseTokenCookie' set to true."); 
     } 

     ... do some work ... 

     session.X = tup.Item2; 
     session.Y = tup.Item1; 
     req.SaveSession(session); 

    } 
} 

는 :

var session = this.SessionAs<CustomSession>(); 
var myX = session.X; 
var myY = session.Y; 

... do some work ... 

var someObj = new MyOtherClass(); 
someObj.DoSomeWork(); 

나중에 동일한 요청에, 나는이 동일한 속성에 액세스하려고하고 다른 세션을 반환했다.

public class MyOtherClass 
{ 
    ...stuff... 
    public void DoSomeWork() 
    { 
     ... 
     var req = HostContext.AppHost.TryGetCurrentRequest(); 
     var session = req.SessionAs<CustomSession>(); //-> this returns a new session? 
     var myX = session.X; //-> so this is null 
     var myY = session.Y; //-> and this is null 

    } 
} 

내 질문에 대한 이유는 무엇입니까? 그것은 같은 요청입니다. 내가 도대체 ​​뭘 잘못하고있는 겁니까?

문맥에서 - JWT를 사용하고 있습니다. (4.5.6 현재) 'MyOtherClass'는 실제로 트랜잭션이 실패하거나 전자 메일 알림을 트리거 할 정도로 중요한 오류가 언제 발생하는지 결정하는 싱글 톤 오류 처리 클래스입니다.

답변

1

HostContext.TryGetCurrentRequest()을 사용할 때 동일한 IRequest 인스턴스에 액세스하지 않으면 캐시에서 세션을 다시 가져와야하는 ASP.NET 요청에 대한 새 인스턴스가 만들어집니다.

서비스에서 동일한 기본 요청 인스턴스를 전달해야합니다 (권장). 그러면 로컬로 캐시 된 동일한 세션 인스턴스에 액세스 할 수있게됩니다. 또는 IRequest.SaveSession()을 사용하여 변경 한 후에 세션을 저장할 수 있습니다. 세션을 다시 가져 오면 수정 된 세션이로드됩니다. 기본 MemoryCacheClient를 사용하는 경우 I/O 비용이 발생하지 않습니다.