0

大規模なアプリケーション内の単一のアクション メソッドに対して、WebApi アプリケーションで RavenDB Aggressive Caching を有効にしようとしています。

これを実現するために、アクション フィルター属性を作成するルートをたどりました。これは を取得しIDocumentSessionOnActionExecutingメソッドを呼び出してアグレッシブ キャッシングを 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 を使用する唯一の「安全な」方法ですか、それとも私が試みていることを実行することは可能ですか? もしそうなら、どのように?

4

1 に答える 1

1

Ayende のブログ プラットフォーム コードに基づいて、フィルター クラスに参照が必要です。

private IDisposable _cachingHandle;

次に、キャッシュ宣言を行うときに、結果をそれに割り当てます。

_cachingHandle  = _documentSession.Advanced.DocumentStore
    .AggressivelyCacheFor(TimeSpan.FromMinutes(15));

次に、実行済みで、

if(_cachingHandle != null)
    _cachingHandle.Dispose();

これにより、不要なキャッシュが停止するはずです。

于 2012-11-10T05:34:47.363 に答える