servicestack,jwt,Session,servicestack,Jwt" /> servicestack,jwt,Session,servicestack,Jwt" />

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

Session 访问服务外部的会话会创建重复的会话,session,servicestack,jwt,Session,servicestack,Jwt,在我的请求筛选器中,我正在自定义会话中设置一些属性,稍后我将从服务访问这些属性。这正如预期的那样有效 请求筛选器: public sealed class CustomAttribute:RequestFilterAttribute { public override void Execute(IRequest req, IResponse res, object requestDto) { var session = req.SessionAs<Cust

在我的请求筛选器中,我正在自定义会话中设置一些属性,稍后我将从服务访问这些属性。这正如预期的那样有效

请求筛选器:

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);

    }
}
公共密封类CustomAttribute:RequestFilterAttribute
{
公共重写void Execute(IRequest请求、IResponse res、object requestDto)
{
var session=req.SessionAs();
如果(!session.FromToken)
{
抛出新的AuthenticationException(“请使用承载令牌或标志“UseTokenCookie”设置为true进行身份验证”);
}
…做些工作。。。
session.X=tup.Item2;
session.Y=tup.Item1;
请求保存会话(会话);
}
}
为我服务:

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

... do some work ...

var someObj = new MyOtherClass();
someObj.DoSomeWork();
var session=this.SessionAs();
var myX=session.X;
var myY=session.Y;
... 做一些工作。。。
var someObj=新的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

    }
}
公共类MyOtherClass
{
东西
公共工程
{
...
var req=HostContext.AppHost.TryGetCurrentRequest();
var session=req.SessionAs();//->这会返回一个新会话吗?
var myX=session.X;//->所以这是空的
var myY=session.Y;//->这是空的
}
}
我的问题是为什么?这是同样的要求。我做错了什么


对于上下文-我正在使用JWT(从4.5.6开始),“MyOtherClass”实际上是一个单例错误处理类,它决定什么时候故障严重到足以导致事务失败或触发电子邮件通知

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

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