我正在明确提到禁用浏览器缓存页面所需的ASP.NET代码.有很多方法可以影响HTTP标头和元标记,我得到的印象是需要不同的设置才能使不同的浏览器正常运行.获得一个评论的参考位以表明哪些适用于所有浏览器以及哪些适用于特定浏览器(包括版本)是非常好的.
关于这个问题有大量的信息,但我还没有找到一个很好的参考资料来描述每种方法的好处,以及某种技术是否已被更高级别的API取代.
我对ASP.NET 3.5 SP1特别感兴趣,但同样可以获得早期版本的答案.
此博客文章Firefox和IE缓存之间的两个重要差异描述了一些HTTP协议行为差异.
以下示例代码说明了我感兴趣的内容
public abstract class NoCacheBasePage : System.Web.UI.Page
{
protected override void OnInit(EventArgs e)
{
base.OnInit(e);
DisableClientCaching();
}
private void DisableClientCaching()
{
// Do any of these result in META tags e.g. <META HTTP-EQUIV="Expire" CONTENT="-1">
// HTTP Headers or both?
// Does this only work for IE?
Response.Cache.SetCacheability(HttpCacheability.NoCache);
// Is this required for FireFox? Would be good to do this without magic strings.
// Won't it overwrite the previous setting
Response.Headers.Add("Cache-Control", "no-cache, no-store"); …Run Code Online (Sandbox Code Playgroud) 简而言之,我希望有人能够点击链接,并获得一次性使用的pdf.我们有库来创建PDF文件,所以这不是问题.
我们可以生成指向aspx页面的链接,让该页面生成pdf,将pdf保存到文件系统,然后将Response.Redirect保存到保存的pdf.然后我们必须以某种方式跟踪和清理PDF文件.
由于我们不需要保留这些数据,如果可能的话,我想做的是让aspx页面生成pdf,并将其作为对原始请求的响应直接提供.这可能吗?
(在我们的例子中,我们正在使用C#,我们希望提供pdf,但似乎任何解决方案都可能适用于各种.NET语言并返回文件类型.)
所以我在一个项目中使用Font Awesome,在测试中我遇到了IE8的问题.
在Windows IE9上,Chrome和Firefox正确显示字体(OS X上的Firefox,Chrome和Safari),但Windows上的IE8有一个问题,我得到一个方框代替字体.

我的代码是:
<!DOCTYPE html>
<!--[if lt IE 7 ]><html class="ie ie6" lang="en"> <![endif]-->
<!--[if IE 7 ]><html class="ie ie7" lang="en"> <![endif]-->
<!--[if IE 8 ]><html class="ie ie8" lang="en"> <![endif]-->
<!--[if (gte IE 9)|!(IE)]><!--><html lang="en"> <!--<![endif]-->
<head>
<meta charset="utf-8" />
<title>Site title</title>
<!--[if lt IE 9]>
<script src="https://html5shim.googlecode.com/svn/trunk/html5.js"></script>
<![endif]-->
<link href=".../css/css.css" rel="stylesheet" type="text/css">
<link href="../css/print.css" rel="stylesheet" type="text/css" media="print">
<link href="../apple-touch-icon.png" rel="apple-touch-icon-precomposed">
<link href="../css/jquery-ui-1.8.23.custom.css" rel="stylesheet" type="text/css">
<link href="../css/jquery-ui-overrider.css" rel="stylesheet" type="text/css">
<link href="https://fonts.googleapis.com/css?family=Lato|Michroma&subset=latin&v2" rel="stylesheet" type="text/css">
<link href="../css/prettify.css" …Run Code Online (Sandbox Code Playgroud) 我正在将PDF流式传输到ASP.NET 2.0中的浏览器.这适用于所有浏览器,通过HTTP和所有浏览器,除了通过HTTPS的IE.据我所知,这曾经在所有版本的IE中工作(过去5年左右),但我们的客户最近才开始报告问题.我怀疑默认情况下禁止将加密页面保存到磁盘安全选项,并且在某些时候默认启用(Internet选项 - >高级 - >安全性).关闭此选项有助于作为解决方案,但作为长期解决方案不可行.
我收到的错误消息是:
Internet Explorer无法从www.sitename.com下载OutputReport.aspx.
Internet Explorer无法打开此Internet站点.请求的网站不可用或无法找到.请稍后再试.
用于创建PDF的工具是DataDynamics的 ActiveReports .创建PDF后,下面是发送它的代码:
Response.ClearContent()
Response.ClearHeaders()
Response.AddHeader("cache-control", "max-age=1")
Response.ContentType = "application/pdf"
Response.AddHeader("content-disposition", "attachment; filename=statement.pdf")
Response.AddHeader("content-length", mem_stream.Length.ToString)
Response.BinaryWrite(mem_stream.ToArray())
Response.Flush()
Response.End()
Run Code Online (Sandbox Code Playgroud)
注意:如果我没有明确指定缓存控制,那么.NET代表我发送no-cache,所以我尝试将cache-control设置为:private或public或maxage =#,但这些似乎都不起作用.
这是扭曲:当我运行Fiddler检查响应头时,一切正常.我收到的标题是:
HTTP/1.1 200 OK
缓存控制:max-age = 1
日期:2009年7月29日星期三17:57:58 GMT
内容类型:application/pdf
服务器:Microsoft-IIS/6.0
MicrosoftOfficeWebServer:5.0_Pub
X-Powered-By :ASP.NET
X-AspNet-Version:2.0.50727
content-disposition:attachment; filename = statement.pdf
Content-Encoding:gzip
Vary:Accept-Encoding
Transfer-Encoding:chunked
一旦我关闭Fiddler并再次尝试,它就会再次失败.我注意到的另一件事是,当Fiddler正在运行时,我得到一个这个网站的安全证书警告消息有问题,我必须点击继续到这个网站(不推荐)才能通过.当Fiddler关闭时,我没有遇到此安全警告,它立即失败.
我很好奇Fiddler和浏览器之间发生了什么,以便它在Fiddler运行时运行但在不运行时会中断,但更重要的是,是否有人有任何想法如何更改我的代码以便将PDF流式传输到IE而无需进行更改到客户端机器?
更新: Fiddler问题得到解决,非常感谢EricLaw,所以现在它的行为始终如一(破坏,有或没有Fiddler运行).
基于谷歌搜索,似乎有大量关于同一问题的报告遍布整个网络,每个报告都有自己特定的响应标题组合,似乎可以解决各个案例的问题.我已经尝试了很多这些建议,包括添加ETag,LastModified日期,删除Vary标头(使用Fiddler)以及Cache-Control和/或Pragma标头的几十种组合.我尝试了ContentType的"Content-Transfer-Encoding:binary"以及"application/force-download".到目前为止,没有任何帮助.有一些 Microsoft 知识库 文章,所有这些都表明Cache-Control:no-cache是罪魁祸首.还有其他想法吗?
更新:顺便说一句,为了完整性,Excel和Word输出也会出现同样的问题.
更新:没有取得任何进展.我通过电子邮件将.SAZ文件从Fiddler发送给EricLaw,他在调试IE时能够重现这个问题,但还没有解决方案.赏金即将到期......
这是我的问题.我正在尝试调用页面:foo.php?docID = bar并将PDF返回到屏幕,该屏幕在数据库中存储为BLOB.
以下是我的代码中实际返回PDF的部分:
$docID = isset($_REQUEST['docID']) ? $_REQUEST['docID'] : null;
if ($docID == null){
die("Document ID was not given.");
}
$results = getDocumentResults($docID);
if (verifyUser($user, $results['ProductId'])){
header('Content-type: application/pdf');
// this is the BLOB data from the results.
print $results[1];
}
else{
die('You are not allowed to view this document.');
}
Run Code Online (Sandbox Code Playgroud)
这在Firefox中运行得非常好.
但是,在IE中,它根本没有显示任何内容.如果我在另一个页面(即google.com),并输入网址转到此页面,它会说已经完成,但我仍然会在屏幕上显示google.com.
我检查了来自firefox和IE的响应的标题.它们完全相同.
有没有人有什么建议?需要更多信息?
编辑:如果它有帮助,这里是响应标题和内容的第一行:
HTTP/1.1 200 OK
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Pragma: no-cache
Content-Length: 349930
Content-Type: application/pdf
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Server: …Run Code Online (Sandbox Code Playgroud) 所以,我有一个发送以下内容的文件:
header("Pragma: public");
header("Expires: 0");
header("Cache-Control: private");
header("Content-type: application/pdf");
header("Content-disposition: inline; filename=file.pdf");
header("Content-length: 7735");
Run Code Online (Sandbox Code Playgroud)
然后我回显文件 - 这是一个PDF文件.
在XP上的IE6和7中运行良好(和FF就此问题)在XP或Vista上运行IE8时,完全相同的代码没有显示任何内容.没有安全警告等,所以我不认为它与此有关.
并且,如果我的记忆正确地为我服务,那么这在IE8上工作了一段时间.
我在这做错了什么?我错过了标题中的内容吗?
在IE8中查看PDF时,有没有办法让我看到正常的标题信息,所以我知道要模仿什么?
看完之后,当SSL打开时,它仍可在IE8 EXCEPT中使用
我正在通过asp.net中的HTTPModule提供一些文件.我想知道将Cache-Control标头设置或不设置为某些东西(如无缓存)是否有任何好处?
编辑:我对此感到好奇的原因是因为我们遇到了一个问题,即在IE中通过SSL会话提供office文档会导致错误(将Cache Control设置为no-cache).也就是说,如果已将Cache-Control设置为no-cache,则无法在IE中通过SSL下载office文档.
基本上我想不包括Cache-Control标头,但想知道它是否会导致问题?
编辑2:好吧,Cache-Control标头已经出来了.我尝试了下面的建议,但遇到了一些问题.每当我添加一个过期标题或根本改变Cache-Control时,当我尝试打开Office 2007文档时,它会尝试将其作为zip打开.(我知道它们真的是封装下的zip文件)但是当我不使用expires头文件或缓存控件时,IE就像Office文档一样打开它们.不幸的是,我没有时间尝试解决这一切 - 因为代码冻结是从现在开始的十分钟:)
谢谢大家帮忙!