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成本