![](/img/trans.png)
[英]Reconnecting to Servicestack session in an asp.net MVC4 application
[英]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.