我有,我想缓存的操作方法:的OutputCache正在发送错误Vary标头时,电话打缓存
[OutputCache(Duration=60*5, Location=OutputCacheLocation.Any, VaryByCustom="index")]
public ActionResult Index()
{
return View();
}
采用这种方法:
public override string GetVaryByCustomString(HttpContext context, string custom)
{
context.Response.Cache.SetOmitVaryStar(true);
context.Response.Cache.VaryByHeaders["Cookie"] = true;
if (User.Identity.IsAuthenticated)
{
Debug.Print("Authenticated");
context.Response.Cache.SetNoServerCaching();
context.Response.Cache.SetCacheability(HttpCacheability.Private);
return null;
}
else
{
Debug.Print("Non authenticated");
return custom;
}
}
我以为它总是会返回一个Vary:Cookie
HTTP标头,但事实并非如此。 做与小提琴手测试并发出两次相同的请求,在第一HTTP调用它去好:
HTTP/1.1 200 OK
Cache-Control: public, max-age=300
Content-Type: text/html; charset=utf-8
Expires: Thu, 09 Feb 2012 10:53:36 GMT
Last-Modified: Thu, 09 Feb 2012 10:48:36 GMT
Vary: Cookie
Server: Microsoft-IIS/7.5
X-AspNetMvc-Version: 3.0
X-AspNet-Version: 4.0.30319
X-Powered-By: ASP.NET
Date: Thu, 09 Feb 2012 10:48:37 GMT
Content-Length: 441
但在第二个,它覆盖了头:
HTTP/1.1 200 OK
Cache-Control: public, max-age=297
Content-Type: text/html; charset=utf-8
Expires: Thu, 09 Feb 2012 10:53:36 GMT
Last-Modified: Thu, 09 Feb 2012 10:48:36 GMT
Vary: *
Server: Microsoft-IIS/7.5
X-AspNetMvc-Version: 3.0
X-AspNet-Version: 4.0.30319
X-Powered-By: ASP.NET
Date: Thu, 09 Feb 2012 10:48:39 GMT
Content-Length: 441
所以,据我所知,即使浏览器是公开的,浏览器也不会缓存请求,因为Vary:*
意味着请求是使用不在URL中或HTTP头中的参数生成的。有没有办法来解决这个问题?
问候。
UPDATE:
以类似的方式,当我把两个相同的身份验证请求,第一次调用得到private
修改,但不是Vary
头:
HTTP/1.1 200 OK
Cache-Control: private, max-age=300
Content-Type: text/html; charset=utf-8
Expires: Thu, 09 Feb 2012 12:43:14 GMT
Last-Modified: Thu, 09 Feb 2012 12:38:14 GMT
Server: Microsoft-IIS/7.5
X-AspNetMvc-Version: 3.0
X-AspNet-Version: 4.0.30319
X-Powered-By: ASP.NET
Date: Thu, 09 Feb 2012 12:38:14 GMT
Content-Length: 443
但第二个获得与未经认证的请求相同的响应:
HTTP/1.1 200 OK
Cache-Control: public, max-age=298
Content-Type: text/html; charset=utf-8
Expires: Thu, 09 Feb 2012 12:44:32 GMT
Last-Modified: Thu, 09 Feb 2012 12:39:32 GMT
Vary: *
Server: Microsoft-IIS/7.5
X-AspNetMvc-Version: 3.0
X-AspNet-Version: 4.0.30319
X-Powered-By: ASP.NET
Date: Thu, 09 Feb 2012 12:39:33 GMT
Content-Length: 443
我已经上传了一个test project showing the issue所以可能你想试试看。
请注意,有一个IHttpModule
会将请求设置为已验证或未验证,具体取决于请求是否包含cookie,但这不是“真实生活”方法,仅用于测试目的。
该项目包含一个链接到自己,在您登录的链接,而另一个链接,将您注销只有一个网页:
- 登录:发送一个cookie在
HTTP 302
重定向到家庭页面。 - LogOut:将
HTTP 302
重定向中的过期cookie再次发送到主页。
的预期/理想行为将是:
- 用户访问索引,并从服务器获取页面。页面显示日期“A”。
- 用户访问再次索引,浏览器显示缓存版本。页面显示日期“A”。
- 清理浏览器缓存。
- 用户访问再次索引,浏览器显示服务器缓存版本。页面显示日期“A”。
- 用户单击登录,并且浏览器会获得一个显示日期“B”的新页面。
- 用户单击注销,浏览器获取服务器缓存页面。该页面再次显示日期“A”。
但是,这是迄今为止行为:
- 用户访问索引,并从服务器获取页面。页面显示日期“A”。
- 用户访问再次索引,浏览器显示缓存版本。页面显示日期“A”。
- 清理浏览器缓存。
- 用户访问再次索引,浏览器显示服务器缓存版本。页面显示日期“A”。
- 用户单击登录,并且浏览器会获得一个显示日期“B”的新页面。
- 用户单击退出,浏览器应该得到服务器缓存页面,但不是。该页面再次从浏览器缓存中显示日期“B”。这是因为经过身份验证的响应中缺少
Vary
标头。
我不知道,如果我得到的东西错了缓存,只是缺少一些细节或者OutputCache
不能很好地工作,但我希望任何指导。
干杯。
更新2:
我的目的是使用HTTP缓存语义:
- 允许浏览器和proxys缓存页的 “公共” 版本。
- 允许浏览器为其用户缓存页面的“已认证”版本。
如果我改变的OutputCache声明只做服务器上的高速缓存和防止下游客户端缓存:
[OutputCache(Duration=60*5, Location=OutputCacheLocation.Server, VaryByCustom="index")]
它的表现不如预期,但防止下游客户端缓存,和那不是我想要的。
如果您还在方法的OutputCache属性上设置了其他VaryBy属性,会发生什么情况? – bzlm 2012-02-09 12:13:24
我已经添加VaryByHeader =“Cookie”,它仍然发生,第二次调用获得Vary = *。 – vtortola 2012-02-09 12:18:14
如果您尝试[在链接问题中链接到的方法]会怎样(http://visitmix.com/writings/using-varybycustom-with-outputcache-in-asp-net-mvc-to-support-caching-for-登录用户),没有改变cookie或修改'GetVaryByCustom'方法中的响应头? (从技术上讲,您不需要通过Cookie来实现仅针对匿名用户的缓存。) – bzlm 2012-02-09 13:13:22