访问服务外部的会话会创建重复

时间:2017-04-13 16:58:43

标签: session servicestack jwt

在我的请求过滤器中,我在自定义会话中设置了一些属性,我稍后将从该服务进行访问。这按预期工作。

请求过滤器:

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 个答案:

答案 0 :(得分:1)

当您使用IRequest时,您没有访问相同的HostContext.TryGetCurrentRequest()实例,它为ASP.NET请求创建了一个新实例,需要从缓存中重新获取会话。

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

相关问题