2017-04-13 54 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 

    } 
} 

我的问题是为什么?这是同样的要求。我究竟做错了什么?

对于背景 - 我用智威汤逊(如4.5.6)和“MyOtherClass”实际上是当故障是不够显著失败交易或触发电子邮件通知它决定一个单独的错误处理类。

回答

1

当您使用HostContext.TryGetCurrentRequest()你不访问相同IRequest实例,它创建ASP.NET请求这就需要从缓存中重新获取会话的新实例。

您将需要通过服务中的相同base.Request实例(推荐),这将允许您访问相同的本地缓存会话实例,或者您可以在使用IRequest.SaveSession()进行更改后保存会话会话被重新获取,它将加载修改后的会话。如果您使用默认的MemoryCacheClient,则不会产生I/O成本。