我有一个全新的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<IRedisClientsManager>(redisFactory); // req. to l
container.Register<IMessageFactory>(mqHost.MessageFactory);
container.Register<ICacheClient>(c =>
(ICacheClient)c.Resolve<IRedisClientsManager>()
.GetCacheClient())
.ReusedWithin(Funq.ReuseScope.None);
然后我创建了一个ControllerBase
,为简单起见,加载并保存每个请求的自定义会话:
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
方法的断点,该值已正确。但是,再次加载页面并检查加载的会话时,没有任何设置。另外,查看Redis数据库,会保存以下blob:
{
"createdAt": "/Date(-62135596800000-0000)/",
"lastModified": "/Date(-62135596800000-0000)/",
"providerOAuthAccess": [],
"isAuthenticated": true,
"tag": 0
}
它没有保存我的自定义属性。谁能告诉我我做错了什么/失踪了?
=== UPDATE ===
如果我更改了基础AuthUserSession
中的任何属性,则对这些属性的更改将保留 - 因此SS似乎会以某种方式决定忽略我的具体类型的属性。
答案 0 :(得分:3)
由于AuthUserSession是DataContract,属性现在在v4中继承,因此您还需要使用[DataMember]
标记每个成员,例如:
public class CustomUserSession : AuthUserSession
{
[DataMember]
public string Hello { get; set; }
}