Redis中的MVC4和ServiceStack会话
我有一个全新的MVC4项目,我在其上安装了ServiceStack MVC入门包(来自MyGET的4.0.12版本)来引导服务堆栈会话的使用。
在我的AppHost
我的自定义会话配置为:
Plugins.Add(new AuthFeature(() => new CustomUserSession(), new IAuthProvider[] { new CredentialsAuthProvider(config) }));
为了测试目的,自定义会话看起来像这样:
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(redisFactory); // req. to l container.Register(mqHost.MessageFactory); container.Register(c => (ICacheClient)c.Resolve() .GetCacheClient()) .ReusedWithin(Funq.ReuseScope.None);
然后我创建了一个ControllerBase
,为简单起见,它加载并保存每个请求的自定义会话:
public abstract class ControllerBase : ServiceStackController { 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
方法上的断点,该值已正确。 但是,再次加载页面并检查加载的会话时,没有任何设置。 此外,查看Redis数据库,保存以下blob:
{ "createdAt": "/Date(-62135596800000-0000)/", "lastModified": "/Date(-62135596800000-0000)/", "providerOAuthAccess": [], "isAuthenticated": true, "tag": 0 }
它没有保存我的自定义属性 。 谁能告诉我我做错了什么/失踪了?
===更新===
如果我从基础AuthUserSession
更改任何属性,那么对这些属性的更改将保持不变 – 因此SS似乎决定忽略我的具体类型的属性。
因为AuthUserSession是一个DataContract,属性现在在v4中inheritance,所以你还需要用[DataMember]
标记每个成员,例如:
public class CustomUserSession : AuthUserSession { [DataMember] public string Hello { get; set; } }