私のプロジェクトでServiceStackをベースライブラリとして使用しています。 私は、別々のプロジェクトとリポジトリである2つの部分のAPIとWEBアプリケーションで自分のアプリケーションを構造化しました。負荷分散環境でのServiceStackセッション処理
認証はAPIレイヤーで行われる必要があり、そのレイヤーにキャッシュする必要があります。私はAPIサーバでOrmliteキャッシュクライアントを使用しています。 APICredentialsAuthProviderで
APIのAppHost.csでvar dbFactory = new OrmLiteConnectionFactory("ConnectionString",SqlServerDialect.Provider);
container.RegisterAs<OrmLiteCacheClient, ICacheClient>();
container.Resolve<ICacheClient>().InitSchema();
Plugins.Add(new AuthFeature(() => new APISession(),
new IAuthProvider[] {
new APICredentialsAuthProvider(new AppSettings())
}));
私は返すapiurl/auth
を使ってAjaxの呼び出しを介して、Webアプリケーションでユーザーを認証していますCacheEntry
テーブル
にDBに格納されますセッションを保存していますAuthenticateResponse
とsessionId
を付けてください。
ss-id
またはss-pid
に更新されている要求の種類に基づいて、プレリクエストフィルタでs-id
以降のCookieにこのsessionIdを更新しています。
//Inside Web application apphost
this.PreRequestFilters.Add((req, res) =>
{
System.Net.Cookie cookie = req.Cookies["s-id"];
req.Cookies["ss-id"] = cookie;
req.SetSessionId(cookie.Value)
});
このアプローチでは、WebおよびAPIアプリケーションで提供して私の場合とそれぞれの構成でOrmliteあるキャッシュからセッションを取得しません。
これを達成する最も良い方法は何ですか?私は
//Inside Web application apphost
this.PreRequestFilters.Add((req, res) =>
{
System.Net.Cookie cookie = req.Cookies["s-id"];
req.Cookies["ss-id"] = cookie;
req.SetSessionId(cookie.Value);
APISession cachedSession = GetCacheClient(req).Get<APISession(SessionFeature.GetSessionKey(cookie.Value));
WEBSession session.PopulateWith<WEBSession, APISession>(cachedSession);
});
これが正常に動作し、私はセッションを取得することができていますが、事前リクエストフィルタでこれを置くことによって、キャッシュ・クライアントを使用してセッションにアクセスすることができる午前しかし
は、DBからの呼び出しを増加させ、私のWebアプリケーション(リクエストごとに)。
これを達成するための代替ソリューションはありますか?
ありがとうございます!