大規模なアプリケーション内の単一のアクション メソッドに対して、WebApi アプリケーションで RavenDB Aggressive Caching を有効にしようとしています。
これを実現するために、アクション フィルター属性を作成するルートをたどりました。これは を取得しIDocumentSession
、OnActionExecuting
メソッドを呼び出してアグレッシブ キャッシングを 15 分間有効にします。次に、同じセッションでOnActionexecuted
呼び出します。DisableAggressiveCaching()
要するに、これにより、かなり奇妙な動作が発生しました。アグレッシブ キャッシングを使用するアクション メソッドが呼び出された後、キャッシュに依存しない他のアクション メソッドへの後続のリクエスト (完全に異なるリクエストを行っている) は、最終的に 15 分のIDocumentSession
場所を取得しAggressiveCacheDuration
ます。これが発生する頻度は、キャッシュされたアクション メソッドが以前に呼び出された回数に比例しているようです。追加する必要があります、私は DI に StructureMap を使用し、IDocumentStore
シングルトンを使用し、 HttpContextScoped を注入していIDocumentSession
ます。新しい IDocumentSession がすべてのリクエストに挿入されていることを確認しましたが、一部のリクエストではキャッシュが有効になっています。
さらに詳しく説明するいくつかのコード...
IoC - RavenRegistry
var documentStore = new DocumentStore {ConnectionStringName = "RavenDB"};
documentStore.Initialize();
For<IDocumentStore>().Singleton().Use(documentStore);
For<IDocumentSession>().HttpContextScoped().Use(x =>
{
var store = x.GetInstance<IDocumentStore>();
var session = store.OpenSession();
return session;
});
AggressivelyCacheAttribute
public class AggressivelyCacheAttribute : ActionFilterAttribute
{
private IDocumentSession _documentSession;
public override void OnActionExecuting(HttpActionContext actionContext)
{
base.OnActionExecuting(actionContext);
_documentSession = actionContext.Request.GetDependencyScope()
.GetService(typeof(IDocumentSession)) as IDocumentSession;
_documentSession.Advanced.DocumentStore
.AggressivelyCacheFor(TimeSpan.FromMinutes(15));
}
public override void OnActionExecuted(HttpActionExecutedContext actionExecutedContext)
{
base.OnActionExecuted(actionExecutedContext);
_documentSession.Advanced.DocumentStore.DisableAggressiveCaching();
}
}
その後、パイプラインで同じIDocumentSession
ものを使用してデータベースにクエリを実行し、その結果をキャッシュします。
後続のリクエストでは、属性が存在しないメソッドで、注入されIDocumentSession
たキャッシュが 15 分に設定されます。これはなぜですか?
私がオンラインで見た唯一の例は、 using ステートメント内でキャッシュを使用してセッションが作成される場所です。それが Aggressive Caching を使用する唯一の「安全な」方法ですか、それとも私が試みていることを実行することは可能ですか? もしそうなら、どのように?