Redis中的MVC4和ServiceStack会话

时间:2014-02-25 14:22:48

标签: c# asp.net-mvc-4 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<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似乎会以某种方式决定忽略我的具体类型的属性。

1 个答案:

答案 0 :(得分:3)

由于AuthUserSession是DataContract,属性现在在v4中继承,因此您还需要使用[DataMember]标记每个成员,例如:

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