我试图帮助一位同事调试过去6个月来一直没有问题的问题.在最近部署ASP.NET MVC 2应用程序之后,FileResult强制用户打开或保存PDF文件的响应在客户端计算机上存在的问题足够长,以便PDF阅读器打开它们.
早期版本的IE(特别是6)是受影响的唯一浏览器.Firefox和Chrome以及较新版本的IE(> 8)都表现得如预期.考虑到这一点,下一节将定义重新创建问题所需的操作.
href属性的普通超链接).在action方法中,标头设置为指示浏览器如何缓存响应.他们是:
response.AddHeader("Cache-Control", "public, must-revalidate, post-check=0, pre-check=0");
response.AddHeader("Pragma", "no-cache");
response.AddHeader("Expires", "0");
Run Code Online (Sandbox Code Playgroud)
对于那些不熟悉标题的人不熟悉:
一个.缓存控制:公共
表示任何缓存都可以缓存响应,即使它通常只是非缓存或只能在非共享缓存中缓存.
湾 缓存控制:必须重新验证
当高速缓存接收到的响应中存在must-revalidate指令时,该高速缓存必须在该条目变为陈旧后才能响应后续请求而不首先使用源服务器重新验证它
C.缓存控制:预检(IE5引入)
定义以秒为单位的间隔,在此之后必须检查实体的新鲜度.检查可能在用户显示资源后发生,但确保在下一次往返时缓存的副本将是最新的.
d.缓存控制:后检查(IE5引入)
定义以秒为单位的时间间隔,在此之后必须在向用户显示资源之前检查实体的新鲜度.
即 Pragma:no-cache(确保向后兼容HTTP/1.0)
当请求消息中存在no-cache指令时,应用程序应该将请求转发到源服务器,即使它具有所请求内容的缓存副本
F.过期
Expires entity-header字段给出了响应被视为过时的日期/时间.
我们从操作中返回文件
return File(file, "mime/type", fileName);
Run Code Online (Sandbox Code Playgroud)向用户显示"打开/保存"对话框
这里有六个其他应用程序使用相同的标题来强制Excel,CSV,PDF,Word和大量其他内容在用户,从来没有一个问题.
在返回a之前,在action方法中设置响应头FileResult.我已经让我的同事尝试创建一个继承的新类,FileResult然后重写该ExecuteResult方法,以便它修改标题,然后base.ExecuteResult()改为 - 没有状态.
我预感到"0"的"Expires"标题是罪魁祸首.根据这篇W3C文章,将其设置为"0"意味着"已经过期".我确实希望它过期,我只是不希望IE在处理它的应用程序有机会打开它之前将其从文件系统中删除.
一如既往,谢谢!
在进一步测试(使用Fiddler检查标头)时,我们发现我们认为设置的响应头不是浏览器解释的响应头.由于我自己并不熟悉代码,因此我没有意识到一个潜在的问题:标题在操作方法之外被踩到了.
尽管如此,我还是要打开这个问题.依然突出是这样的:有似乎是有出入Expires具有数值头 …
我想知道是否可以从特定的AJAX方法清除缓存.
说我有这个:
$.ajax({
url: "test.html",
cache: true,
success: function(html){
$("#results").append(html);
}
});
Run Code Online (Sandbox Code Playgroud)
现在99%的时间都可以使用缓存结果,因为它应该始终具有相同的内容.但是,如果用户更新此内容,它(当然)会更改.如果它被缓存,它仍将显示旧内容.
因此,如果我可以为此方法选择此缓存并清除它并且所有其他缓存的内容都会保留,那将会很酷.
可以这样做吗?
编辑
我不跟随.我看到如果你设置cache为false,它会创建一个唯一的URL来阻止浏览器缓存它.
我的问题是我希望它被缓存,直到有人对它进行更新.然后它不应该被缓存,直到他们再次点击它.然后它应该再次缓存.
基本上,我有一个更新模型对话框(jquery UI),它会显示一个更新表单,以便用户可以更新表行.当他们单击"更新"时,它会更新该表行.现在,一列可以有几个段落的数据,这会使表看起来很糟糕.
因此,为了保留表格,我在其中放置了一个名为"显示数据"的链接.现在,单击此按钮时,将显示一个对话框模型框,并从服务器中提取数据.
如果他们点击它5次就会重新加载5次.这就是我想要缓存它的原因.但是,如果他们点击它并且它被缓存,那么无论出于何种原因他们去更新该行并单击"显示数据",他们将获得缓存版本,而不是更新版本.
我可能会隐藏所有段落并使用jquery显示它们,但我宁愿按需提供它们.否则会有很多隐藏的垃圾,它会减慢页面的速度(想象一下,如果某个人有50行,那些列中的每一行都有1000个字符).
如果您有17条记录并且一次显示15条记录,那么当您在第2页时,您会看到17-17的记录 - 这是有意义的.
现在当你进入第二页并且你点击导航上的重载按钮(设置数据类型='json')时网格重新加载导航显示网格显示16-30的17.这似乎是一个bug - 有解决方法吗?
网格仍然有17行 - 但是当它应该只显示两行(16-17)时,它试图在第二页上显示完整的15行(rowNum)设置.导航分页文本不正确(当只有17行时指30行).
我使用的是Asp.net Web Forms,之前我使用过这个jqGrid样本,这个样本不是免费的,我后来意识到,现在混乱被清除了,我现在必须使用jqGrid开源的东西,因为我不会选择商业的,任何人都可以指向我开始使用jqGrid和Asp.Net Web Forms的链接,如果有人给出一个示例,它将显示jqGrid中的示例表中的免费列,那将是非常好的,我在网上发现了一些文章,但是无法理解有用.欢迎任何建议.谢谢.