簡體   English   中英

Redis中的MVC4和ServiceStack會話

[英]MVC4 and ServiceStack session in Redis

我有一個全新的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
}

它沒有保存我的自定義屬性 誰能告訴我我做錯了什么/失蹤了?

===更新===

如果我改變任何從基本的屬性AuthUserSession的變化對這些性能持久 -所以它似乎是SS某種程度上決定不理會從我的具體類型的屬性。

因為AuthUserSession是一個DataContract,屬性現在在v4中繼承,所以你還需要用[DataMember]標記每個成員,例如:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM