我有一个ASP.net应用程序,它返回一个二进制PDF文件(从数据库中存储,以前上传过)到客户端。
我的代码适用于所有浏览器,除了Internet Explorer 6(我的生活故事!)。在IE6中,当用户单击打开时,Adobe会报告错误:“打开此文档时出错。无法找到该文件。”
当用户点击“保存”时,PDF保存正常,双击即可打开。我很难过。谷歌提出了缓存建议(将缓存控制设置为私有等),我尝试了所有这些,但没有任何效果。
奇怪的(呃)行为是当我在ASP .net服务器层(使用NFop)从头开始生成PDF时,IE会打开它(使用相同的代码!)。
这是我通过网络发送二进制数据的代码:
// Firefox doesn't like spaces in filenames.
filename = filename.Replace(" ", "_");
string extension = Path.GetExtension(filename);
string contentType;
switch (extension)
{
case "pdf":
contentType = "application/pdf";
break;
default:
contentType = "application/x-unknown";
break;
}
context.Response.Clear();
context.Response.AddHeader("content-disposition", "attachment;filename=" + filename);
context.Response.Charset = "";
context.Response.ContentType = contentType;
context.Response.BinaryWrite(data);
context.Response.Flush();
以下是应用程序版本:
非常感谢任何帮助/建议。谢谢:)
编辑:
我已插入Fiddler来查看标题,确定它看起来似乎是一个缓存问题。哎呀!
当我上传我的NFop PDF(工作的那个)时,它正在发送cache-control = private。 当我上传附件PDF(无效的附件)时,它会发送无缓存。
我查看了Response对象,当我调用context.Response.Flush()时,两者看起来都有相同的标题。
还是难倒!
解决:
我们框架中的某个地方是一个使用反射调用的流氓方法:
/// ///设置请求的expiratoin并强制不缓存 /// protected void SetCacheExpiration(HttpContext context) { //将缓存设置为立即过期 context.Response.Cache.SetCacheability(HttpCacheability.NoCache); context.Response.Cache.SetSlidingExpiration(真); context.Response.Cache.SetExpires(DateTime.Now); context.Response.Cache.SetMaxAge(new TimeSpan(0,0,0)); context.Response.Cache.SetNoStore(); context.Response.Cache.SetAllowResponseInBrowserHistory(假); context.Response.Cache.SetValidUntilExpires(假); context.Response.Cache.SetRevalidation(HttpCacheRevalidation.AllCaches);
}
感谢您的帮助,缓存!有趣的是,唯一没有缓存下载(打开时)的浏览器是IE6。
答案 0 :(得分:1)
这是IE6的the method I've used before to render in-browser PDFs。再次......这是我们在浏览器中显示PDF的项目,但它应该能够很好地为您在阅读器中显示的PDF提供服务。
答案 1 :(得分:0)
我们框架中的某个地方是一个使用反射调用的流氓方法:
/// <summary>
/// Sets the expiratoin of the request and force no cache
/// </summary>
protected void SetCacheExpiration(HttpContext context)
{
//sets the cache to expire immediately
context.Response.Cache.SetCacheability(HttpCacheability.NoCache);
context.Response.Cache.SetSlidingExpiration(true);
context.Response.Cache.SetExpires(DateTime.Now);
context.Response.Cache.SetMaxAge(new TimeSpan(0, 0, 0));
context.Response.Cache.SetNoStore();
context.Response.Cache.SetAllowResponseInBrowserHistory(false);
context.Response.Cache.SetValidUntilExpires(false);
context.Response.Cache.SetRevalidation(HttpCacheRevalidation.AllCaches);
}
感谢您的帮助,缓存!有趣的是,唯一没有缓存下载(打开时)的浏览器是IE6。