我有一个ASP.NET应用程序,它将一个二进制PDF文件(存储在数据库中,之前已上载)返回到客户机。
除了Internet Explorer 6(我的生活故事!).IE6中,当用户单击“打开”时,Adobe报告错误:“打开此文档时出错。找不到文件。“
当用户单击“保存”时,PDF保存得很好,可以通过双击打开。我被难住了。谷歌已经给出了缓存(将cachecontrol设置为private等)的建议,我已经尝试了所有这些方法,但没有任何效果。
wierd(er)行为是当我从零开始在我的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();
以下是应用程序版本:
-
ASP.NET 3.5
-
IE6.0.2900.2180.xpsp_s(美国)
-
列表项
-
P2号公路091208-2028
-
Adobe Reader 8.0.0版
-
Windows XP SP 2
-
SQL Server 2008
如有任何帮助/建议,我们将不胜感激。谢谢)
编辑:
我已经插入了fiddler来查看报头,并且确信它确实是一个缓存问题。GRRR!
当上传我的nfop pdf(有效的)时,它会发送cache control=private。
当我的附件PDF(不工作的)被上传时,它不发送缓存。
我在response对象中查找过,调用context.response.flush()时,这两个对象似乎都有相同的头。
还是难住了!
解决了的
:
在我们的框架中,有一个流氓方法正在使用反射调用:
//
///设置请求的expiratoin,强制不缓存
//
受保护的void setcacheexpiration(httpContext上下文)
{
//将缓存设置为立即过期
context.response.cache.setcacheability(httpcacheability.nocache);
context.response.cache.setslidingexpiration(true);
context.response.cache.setExpires(datetime.now);
context.response.cache.setmaxage(新时间跨度(0,0,0));
context.response.cache.setnostore();
context.response.cache.setallowResponseInBrowserHistory(false);
context.response.cache.setvalidUntilExpires(false);
context.response.cache.setrevalidation(httpcacherevalidation.allcaches);
}
谢谢你的帮助,缓存!有趣的是,唯一没有缓存下载(打开时)的浏览器是IE6。