【问题标题】:Enabling browser to begin rendering initial pages quickly on large PDF files使浏览器能够开始在大型 PDF 文件上快速呈现初始页面
【发布时间】:2014-05-15 21:57:31
【问题描述】:

我的应用程序目前允许直接链接到服务器上的 PDF 文件,但现在需要保护这些文件,并且出于安全考虑,必须逐步取消直接链接。

我尝试了以下几行将 PDF 文件发送给客户端。它工作正常。

        Response.Clear();
        Response.ContentType = "Application/pdf";
        Response.WriteFile(filepath);
        Response.End();

但有一个问题。

链接 PDF 文件后,浏览器会立即呈现前几页,同时下载其余页面。但使用上述方法,浏览器会等到整个文件下载完毕,然后继续渲染 PDF。

那么有没有办法诱使浏览器模仿打开直接链接的 PDF?

【问题讨论】:

    标签: c# asp.net pdf iis webforms


    【解决方案1】:

    阅读您的帖子后,我意识到我的应用程序具有相同的行为(尽管考虑到文件的典型大小和使用的格式,这不是问题 - 至少现在还没有......)经过一些研究,您会必须根据您要引入的复杂程度从几个选项中进行选择:

    如果您想要一个更简单的实现,您需要稍微改变您的方法以设置一个循环,将一定数量的文件读入内存中的缓冲区,然后对该缓冲区执行Response.Write。然后在循环中执行Response.Flush 将该数据推送到客户端。由于这是同步的,您必须等到刷新完成才能下推文件的下一个块。但是,如果主要目标是获取前几个块以便客户端应用程序可以开始使用它们,那么这可能会满足您的需求。

    如果您想要更好的服务器端可扩展性并愿意接受更多的复杂性,则需要使用Response.BeginFlush 进行探索。我相信.Net 4.5 中引入了异步写入。这是一个可以帮助您入门的链接:

    http://www.slideshare.net/pragyanshis/asynchronous-reading-and-writing-http-r-equest

    我正在为我自己的应用程序在“待办事项”列表中添加探索这两种方法...

    【讨论】:

    • 我尝试了这种方法,但浏览器的行为没有任何不同。它仍然等待整个文件在渲染之前下载。
    • 您是否在多个浏览器中尝试过此操作并遇到相同的行为?
    • 我刚刚注意到的一件事是,您似乎没有将Response.BufferOuput(或已弃用的Response.Buffer)设置为False。您是否这样做过,是否会改善用户体验?
    • 我尝试将 Response.BufferOutput 设置为 false。没什么区别。我也在多个浏览器上尝试过这个并得到了相同的结果。它们都在渲染 PDF 之前等待整个文件的传输。
    • 嗯....另一个想法:您最近是否更改了可能影响数据如何从应用程序流出到客户端的 Web 服务器软件版本或其相关配置?我开始怀疑这是否是 IIS 配置问题。
    猜你喜欢
    • 2014-12-03
    • 2018-12-28
    • 2011-01-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多