如何在IE6中显示PDF附件

时间:2010-02-23 22:40:02

标签: asp.net pdf internet-explorer-6

我有一个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();

以下是应用程序版本:

  • ASP .net 3.5
  • IE6.0.2900.2180.xpsp_s
  • 列表项
  • p2_gdr.091208-2028
  • Adob​​e Reader 8.0.0版
  • Windows XP SP 2
  • SQL Server 2008

非常感谢任何帮助/建议。谢谢:)

编辑:

我已插入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。

2 个答案:

答案 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。