- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我有一个要缓存的操作方法:
[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 header ,但事实并非如此。使用 Fiddler 进行测试并发出两次相同的请求,在第一个 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
但在第二个中,它覆盖了 header :
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 header 中。有办法解决这个问题吗?
问候。
更新:
以类似的方式,当我发送两个相同的经过身份验证的请求时,第一个调用获得 private
修饰符,但不是 Vary
header :
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 将请求设置为经过身份验证,这不是“现实生活”的方法,它只是用于测试目的。
该项目仅包含一个网页,该网页带有指向自身的链接、一个让您登录的链接和另一个让您注销的链接:
HTTP 302
重定向中的 cookie 发送到主页。HTTP 302
重定向中的过期 cookie。预期/理想行为将是:
但这是目前为止的行为:
Vary
header 。我不知道我是否在缓存方面犯了错误,只是遗漏了一些细节,或者 OutputCache
不能很好地工作,但我将不胜感激任何指导。
干杯。
更新 2:
我的意图是使用 HTTP 缓存语义来:
如果我更改 OutputCache 声明以仅在服务器上进行缓存并阻止下游和客户端缓存:
[OutputCache(Duration=60*5, Location=OutputCacheLocation.Server, VaryByCustom="index")]
它的行为符合预期,但下游和客户端缓存被阻止,这不是我想要的。
最佳答案
我不认为 [OutputCache]
属性是你想要的,VaryByCustom
方法基本上是说我想根据这些参数缓存不同的版本,它实际上没有Do Not Cache 选项,并且该属性中的大部分代码都是围绕基于服务器的缓存构建的。
也就是说 MSDN 上的文档用于自定义缓存似乎表明您需要返回一个字符串以根据身份验证状态变化:
public override string GetVaryByCustomString(HttpContext context, string custom)
{
if(custom == "user") return "User:" + context.Request.User.Identity.Name;
return base.GetVaryByCustomString(context, custom);
}
然后在 VaryByCustom
中使用 user 文字:
[OutputCache(Duration=60*5, Location=OutputCacheLocation.Any, VaryByCustom="user")]
public ActionResult Index()
{
return View();
}
所以基本上这将导致为匿名(假设匿名身份是空字符串或其他东西)和服务器上的每个用户构建缓存,并将 Vary: *
发送到客户端我相信。显然您要找的东西并不理想。
如果您真的只想使用 HTTP 缓存来缓存未经身份验证的版本,我建议您不要使用 OutputCacheAttribute
并使用更多自定义内容。
您可以轻松地在自己的自定义属性中编写类似于您的 GetVaryByCustomString
实现的内容(这只是一些伪代码,需要的不止这些):
public class HttpCacheUnauthenticatedAttribute : ActionFilterAttribute
{
public override void OnActionExecuted(ActionExecutedContext filterContext)
{
if(!filterContext.HttpContext.Request.IsAuthenticated) {
//TODO: set unauthenticated caching values and vary here
}
}
}
然后用它标记你的操作方法:
[HttpCacheUnauthenticated]
public ActionResult Index()
{
return View();
}
关于asp.net - 当调用命中缓存时,OutputCache 发送错误的 Vary header ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9210581/
关于 APC 操作码缓存,什么是“命中与未命中”?我已经安装了 APC 并且它运行良好,但我有“一些”失误,我想知道这是否“不好”。此外,我正在运行 Openx,因此,我很快就会填满“缓存完整计数”。
我试过这个: def test_send_confirm_hit(monkeypatch): hit = False def called(): global hit
是否可以将找到的单词插入到替换中? $(function() { content = 'hallo mein name ist peter und ich komme aus berlin.
我有一个允许用户将文件上传到文件夹的网站。首先,我检查文件是否存在,如果存在,然后检查复选框的值以确定用户是否要覆盖现有文件。如果点击上传并且未选中该框,我会执行一个带有消息和后退按钮的 die()
我有多个不同的进程通过 IPC 进行通信,当使用 gdb 调试单个进程时,每当遇到断点时,我都会尝试向其他进程发送消息。有没有一种方法可以自动在遇到断点时自动调用一个函数/一段代码(NotifyAll
目前,通过管道传输到 jq 的 cat 命令帮助我解析工作目录中的多个 JSON 文件,并根据正则表达式模式匹配文件中所有可用的电子邮件 ID。但是,我很想识别正则表达式模式被命中/匹配的文件名 ca
我们希望将 podname 解析为 IP,以在 akka 集群中配置种子节点。这是通过在 Kubernetes 中使用 headless (headless)服务和有状态集的概念来实现的。但是,如何在
Maven 项目具有以下文件夹结构: src/main/java src/main/resources src/test/java src/test/resources 如果我们导航到 Maven 项
我只使用 c 几个星期,所以很可能会出现我忽略的明显错误。我看过其他线程,但我不明白我正在读的很多内容。该程序假设有一个无限大的牌组。 已知问题: clearBuffer 当前未使用,我正在尝试不同的
我已将我的 AdMob 代码实现到我的 XML 文件中,如下所示: 在我的 Activity 的 onCreate 方法中: // load ads
我的作业是通过示例程序确定给定跟踪文件的缓存读/写/未命中/命中次数。 举例来说,这是示例跟踪输出的前 10 行。 0x37c852: W 0xbfd4b18c 0x37cfe0: W 0xbfd
https://plnkr.co/edit/2h6fV5yTjeUqLP3SvbvO?p=preview 预期 登录后应用程序重定向到 $state container,其中包含 dashboard
ElasticSearch 独立于 from 和 size 参数,基于查询的所有命中构建聚合结果。在大多数情况下,这是我们想要的,但我有一个特殊情况,我需要将聚合限制为前 N 个命中。 limits
我使用 Intel PCM 进行细粒度的 CPU 测量。在我的代码中,我试图测量缓存效率。 基本上,我首先将一个小数组放入 L1 缓存(通过多次遍历),然后启动计时器,再遍历数组一次(希望使用缓存),
我在为 javascript 滑动元素定义点击区域时遇到问题。 参见示例: http://www.warface.co.uk/clients/warface.co.uk/ 请滑过右侧的灰色框以显示按钮
我正在尝试在 foldersystem 中使用 os.walk() 找到几个 'my_file.bat',如果文件名匹配它应该用 subprocess.call() 或 .run() 调用。问题是 o
我有一个端点,我可以在其中请求我使用 Siesta 查询的多条数据(例如 https://example.com/things?ids=1,2,3) .如果我只缓存了一些 things ,我试图弄清楚
这是我的代码: public static function test(){ try{ $apiContext = ApiContext::create(
我使用 PHP 在需要时传递登录表单,代码如下: $htmlForm = ''.''; switch(LOGIN_METHOD) { case 'both': $htmlFor
我正在使用 nginx-lua带有 redis 的模块提供 ember-app 的静态文件. index文件内容存储在redis作为 value由 nginx 正确提供服务当(根)domain/IP被
我是一名优秀的程序员,十分优秀!