【问题标题】:How to do donut caching with c# mvc and Varnish?如何使用 c# mvc 和 Varnish 进行甜甜圈缓存?
【发布时间】:2015-11-18 13:00:25
【问题描述】:

我添加到清漆配置

sub vcl_fetch {

   set beresp.do_esi = true; 

}

}

在我的 mvc 应用程序中,我有一个子操作

<div>@* this should not be cached, I change the returned value in my DB *@
        1 @Html.Action("GetHour", "Index", new { id = 5 })
    </div>

    <div>
        2
        <esi:include>@* this should be cached *@
            @Html.Action("GetHour", "Index", new { id = 5 })
        </esi:include>
    </div>

并添加了一个请求头

Request.Headers.Add("X-Esi", "1");

但是 Varnish 一直在缓存整个页面。

我错过了什么? 我在浏览器中注意到请求标头 X-Esi 不存在。 还清漆正确删除标签&lt;esi:include

GetHour 中的代码非常简单,只需从 SQL Server 中检索一个小数。

【问题讨论】:

  • 我不认为您可以将内容放在 esi:include 标记内并期望它被缓存。您需要在 esi:include 标记上指定 src 属性:
  • 如果您不想缓存页面,您应该指定一个 Cache-Control 标头,其 max-age 或 s-maxage 为 0 以告诉 varnish 不要缓存
  • 你是对的。更改为 并将 ttl 配置为 0 并且可以工作。谢谢。

标签: c# asp.net-mvc varnish esi donut-caching


【解决方案1】:

改变这个:

<esi:include>@* this should be cached *@
        @Html.Action("GetHour", "Index", new { id = 5 })
    </esi:include>

为此:

<esi:include src="/Index/GetHour/5">
          </esi:include>

并添加到 Varnish default.vcl:

sub vcl_fetch {
   set beresp.do_esi = true;

  if(bereq.url ~ "/Index/GetHour"){
    set beresp.ttl = 0s;
  }
}

@ronald 在上面的 cmets 中部分回答了这个问题。 还必须删除 [ChildActionOnly] 注释。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-17
    相关资源
    最近更新 更多