gpt4 book ai didi

c# - Redis 中的 MVC4 和 ServiceStack session

转载 作者:太空狗 更新时间:2023-10-30 01:36:31 24 4
gpt4 key购买 nike

我有一个全新的 MVC4 项目,我在该项目上安装了 ServiceStack MVC 入门包(来自 MyGET 的 4.0.12 版)以引导服务堆栈 session 的使用。

在我的 AppHost 中,我的自定义 session 配置为:

Plugins.Add(new AuthFeature(() => new CustomUserSession(),
new IAuthProvider[] {
new CredentialsAuthProvider(config)
}));

出于测试目的,自定义 session 如下所示:

public class CustomUserSession : AuthUserSession
{
public string Hello { get; set; }
}

并且 ICacheClient 被注册为一个 redis 客户端:

// register the message queue stuff 
var redisClients = config.Get("redis-servers", "redis.local:6379").Split(',');
var redisFactory = new PooledRedisClientManager(redisClients);
var mqHost = new RedisMqServer(redisFactory, retryCount: 2);
container.Register<IRedisClientsManager>(redisFactory); // req. to l
container.Register<IMessageFactory>(mqHost.MessageFactory);

container.Register<ICacheClient>(c =>
(ICacheClient)c.Resolve<IRedisClientsManager>()
.GetCacheClient())
.ReusedWithin(Funq.ReuseScope.None);

然后我创建了一个 ControllerBase,为简单起见,它为每个请求加载和保存自定义 session :

public abstract class ControllerBase :  ServiceStackController<CustomUserSession>
{
protected override IAsyncResult BeginExecute (System.Web.Routing.RequestContext requestContext, AsyncCallback callback, object state)
{
ViewBag.Session = this.UserSession;
return base.BeginExecute (requestContext, callback, state);
}

protected override void EndExecute(IAsyncResult asyncResult)
{
SaveSession(null);

base.EndExecute(asyncResult);
}
public void SaveSession(TimeSpan? expiresIn = null)
{
Cache.CacheSet(SessionFeature.GetSessionId(), UserSession, expiresIn ?? new TimeSpan(0, 30, 0));
}
}

然后我修改 Hello 属性以在我的一个操作中读取“World”,我可以通过 SaveSession 方法上的断点清楚地看到该值具有被妥善处理。但是,在再次加载页面并检查加载的 session 时,没有任何设置。此外,查看 Redis 数据库,保存了以下 blob:

{
"createdAt": "/Date(-62135596800000-0000)/",
"lastModified": "/Date(-62135596800000-0000)/",
"providerOAuthAccess": [],
"isAuthenticated": true,
"tag": 0
}

它没有保存我的自定义属性。谁能告诉我我做错了什么/错过了什么?

===更新===

如果我更改基础 AuthUserSession 中的任何属性,对这些属性的更改会保留 - 所以看起来 SS 不知何故决定忽略我的属性具体类型。

最佳答案

因为AuthUserSession是一个DataContract,v4现在继承了属性,所以还需要用[DataMember]标记每个成员,例如:

public class CustomUserSession : AuthUserSession
{
[DataMember]
public string Hello { get; set; }
}

关于c# - Redis 中的 MVC4 和 ServiceStack session ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22016974/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com