Redis의 MVC4 및 ServiceStack 세션
-
21-12-2019 - |
문제
ServiceSack MVC 스타터 팩 (Myget에서 버전 4.0.12 버전)을 설치 한 브랜드의 새로운 MVC4 프로젝트가 있습니다. 서비스 스택 세션의 사용을 부트 스트랩합니다.
내 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));
}
}
.
i는 Hello
속성을 수정하여 내 작업 중 하나에서 "World"를 읽으므로 값이 올바르게 발생한 SaveSession
메소드의 중단 점으로 분명히 볼 수 있습니다. 그러나 페이지를 다시로드하고로드 된 세션을 검사하면 아무것도 설정되지 않습니다. 또한 Redis 데이터베이스를보고 다음 BLOB가 저장됩니다.
{
"createdAt": "/Date(-62135596800000-0000)/",
"lastModified": "/Date(-62135596800000-0000)/",
"providerOAuthAccess": [],
"isAuthenticated": true,
"tag": 0
}
.
사용자 정의 속성을 저장하지 않습니다 . 누구든지 잘못 / 누락 된 것을 말해 줄 수 있습니까?
=== update===
Base AuthUserSession
에서 속성을 변경하면 해당 속성의 변경 사항을 변경하십시오. 은 지속됩니다. 그래서 SS는 어떻게 든 내 콘크리트 유형에서 속성을 무시하기로 결정합니다.
해결책
authUserSession이 DataContract이기 때문에 속성이 v4에서 상속되므로 각 멤버를 [DataMember]
, e.g :
public class CustomUserSession : AuthUserSession
{
[DataMember]
public string Hello { get; set; }
}
. 제휴하지 않습니다 StackOverflow