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