15

ホストに応じて特定のページをキャッシュする機能を実装しようとしています。これは、同じパラメーターを持つ複数のバージョンのページを作成でき、リクエストに関する唯一の違いは、リクエストされているホストであるためです。

したがって、たとえば、これら2つのURLは同じページを要求しますが、スタイルは異なります。

http://www.a.com/something/specific

http://www.b.com/something/specific

ここで概説した例を見ていきます。

http://msdn.microsoft.com/en-us/library/5ecf4420%28v=VS.90%29.aspx

しかし、それは私には意味がありません。

これをglobal.asaxに追加しました:

public override string GetVaryByCustomString(HttpContext context, string arg)
{
    if (arg == "host")
    {
        return "host=" + context.Request.Url.Host;
    }

    return base.GetVaryByCustomString(context, arg);
}

この例では、「プログラムでカスタム文字列を設定するには、SetVaryByCustomメソッドを呼び出して、使用するカスタム文字列を渡します」と、次のようなコードで示しています。

Response.Cache.SetVaryByCustom("host");

問題は、これをどうしたらよいかわからないことです。前の行を追加したのMvcApplication_EndRequestは理にかなっているようですが、ブレークポイントを設定しGetVaryByCustomStringてもヒットしないため、これは正しくないと思います。

誰かが私がここで欠けているものを教えてもらえますか?または、これを別の方法で行う必要がある場合はどうなりますか?

編集:以下のREダリンの答え、私はすでに私の行動を次のように飾っています:

[CustomOutputCache(CacheProfile = "FundScreener")] // or similar depending on the action

ここで、CustomOutputCacheAttributeは次のように定義されます。

[AttributeUsage(AttributeTargets.Method, AllowMultiple = false, Inherited = true)]
public class CustomOutputCacheAttribute: OutputCacheAttribute
{
    public override void OnResultExecuted(ResultExecutedContext filterContext)
    {
        AddLabelFilesDependency(filterContext);
        base.OnResultExecuted(filterContext);
    }

    private static void AddLabelFilesDependency(ControllerContext filterContext)
    {
        IConfigurationManager configurationManager = ObjectFactory.TryGetInstance<IConfigurationManager>();
        if (configurationManager == null 
            || filterContext == null 
            || filterContext.RequestContext == null
            || filterContext.RequestContext.HttpContext == null
            || filterContext.RequestContext.HttpContext.Response == null
            )
        {
            return;
        }
        string[] files = Directory.GetFiles(configurationManager.LabelsDirectoryPath, "*.xml");
        foreach(var file in files)
        {
            filterContext.RequestContext.HttpContext.Response.AddFileDependency(file);
        }
    }
}

ここで、プロファイルは次のように定義されます。

<add name="FundScreener"
     location="Server"
     enabled="true"
     varyByParam="*"
     duration="1200"
     sqlDependency="mmftms:offline.ScreenerData"/>

これを変更する必要がありますか?

4

4 に答える 4

6

SetVaryByCustomMVCで呼び出す必要はありません。この属性を使用できOutputCacheます。次のブログ投稿をチェックしてください。

于 2011-03-15T15:27:15.770 に答える
4

ホストごとに異なるキャッシュが必要な場合は、次を使用できます。

VaryByHeader = "host"

これは、リクエストでヘッダー「host」の値を使用してキャッシュを変更するためです。これは、コントローラー/アクションのOutputCacheディレクティブに追加することも、web.configでグローバルに指定することもできます。

ホストバインディングを使用する場合、ホストヘッダーは常に存在します。これは、あなたに当てはまるようです。

于 2011-03-15T15:39:14.323 に答える
3

GetVaryByCustomString(...)はリクエストごとにキャッシングレイヤーによって呼び出され、リクエストと渡された引数を調べて、このリクエストを「分類」する方法を決定する機会があります。したがって、VaryByCustomプロパティ/属性を「host」に設定すると、GetVaryByCustomString関数内にホストを返すコードを記述します(上記の例のように)。キャッシングレイヤーは、返された値で引数「host」をすでにキャッシュしていることを検出すると、キャッシュされた応答を返します。それ以外の場合は、リクエストを実行してキャッシュに追加します。

于 2011-03-15T15:27:54.400 に答える
0

編集内容に基づいてVaryByCustom="host"、FundScreener出力キャッシュプロファイルに追加します。

于 2011-03-15T15:33:56.557 に答える