1

コントローラーアクションの上にOutputCache属性を定義して、サーバーがさまざまなユーザーに同じ応答をすばやく提供できるようにします。Buそれはページ全体をキャッシュします。つまり、を返すアクションをキャッシュした場合、マスターページもキャッシュされますView()。したがって、マスターページの上部にあるユーザーアカウント情報は、すべてのユーザーによって共有されます。マスターページ_Layout.cshtmlではなく、コンテンツページのみをキャッシュしたい。どうすればそれを除外できますか?

編集:私が問題を抱えている部分はこれです:

@if(Request.IsAuthenticated) {
    <text>Hello <strong>@User.Identity.Name</strong>!</text>
    @: | 
    @Html.ActionLink("Index", "Index", "Account")
    @: |
    @Html.ActionLink("Logout", "Logout", "Account")
}
else
{
    @:|
   @Html.ActionLink("Login", "Login", "Account")
}

コントローラアクションをキャッシュすると、返されるビューにもこのユーザーログイン部分がキャッシュから運ばれるため、ほとんどすべてのユーザーに間違った敬礼が与えられます。ページがキャッシュされている場合でも、この部分を動的に生成するにはどうすればよいですか?

4

1 に答える 1

2

VaryByCustomはあなたが望むものです。

これをGlobal.asaxに入れます。

public override string GetVaryByCustomString(HttpContext context, string custom)
{
    return "User".Equals(custom, StringComparison.OrdinalIgnoreCase)
        ? User.Identity.Name
        : base.GetVaryByCustomString(context, custom);
}

...次に[OutputCache(VaryByCustom = "User")]属性を使用します。

これにより、ページ全体が個別にキャッシュされますが、ユーザーごとに個別のキャッシュが作成されます。

他のオプションを探している場合は、MVCドーナツキャッシングまたはMVCドーナツホールキャッシングを検索してください。

コメントに返信

ドーナツホールキャッシングが必要なようです。この答えがあなたを助けるかどうか見てください。

于 2012-10-14T14:18:43.357 に答える