0

此代码将始终使我的 aspx 页面加载两次。这与 AutoEventWireup 无关。

Response.Clear();
Response.ContentType = "application/pdf";
Response.AppendHeader("Content-Disposition", "inline;filename=data.pdf");
Response.BufferOutput = true;
byte[] response = GetDocument(doclocation);
Response.AddHeader("Content-Length", response.Length.ToString());
Response.BinaryWrite(response);
Response.End();

当我硬编码一些虚拟值时,此代码只会使我的页面加载一次(应该如此)。

Response.Clear();
Response.ContentType = "application/pdf";
Response.AppendHeader("Content-Disposition", "inline;filename=data.pdf");
Response.BufferOutput = true;
byte[] response = new byte[] {10,11,12,13};
Response.AddHeader("Content-Length", response.Length.ToString());
Response.BinaryWrite(response);
Response.End();

我还在 web.config 文件中增加了请求长度以获得良好的度量。

<httpRuntime executionTimeout="180" maxRequestLength="400000"/>

依然没有。有人看到我看不到的东西吗?

4

4 回答 4

1
GetDocument(doclocation);

这种方法可能会以某种方式返回重定向代码吗?或者可能是您的动态内容的 iframe 或 img?

如果是这样的话:

通常,由于 url 响应,控件可能会被调用两次。首先它呈现内容。之后,您的浏览器会尝试下载实际上是生成的动态内容的标记 (iframe,img) 源。因此它向 Web 服务器发出另一个请求。在这种情况下,创建的另一个页面对象具有不同的视图状态,因为它是不同的请求。

于 2009-01-19T00:37:09.187 回答
0

快速猜测:会不会是在页面生命周期的这个阶段,包含 GetDocument() 的类已经进行了垃圾回收?ASP.NET Worker 进程是否需要重新加载页面才能再次读取该方法?

于 2009-01-19T00:40:27.760 回答
0

您是否在 Page_Load 中尝试过?为什么 GetDocument 是静态方法?

于 2009-01-28T21:22:49.733 回答
0

你找到解决方案了吗?我有同样的问题,我的代码几乎是你的镜像。主要区别是我的 pdf 托管在 IFrame 中。

我发现了如此有趣的线索:如果我流回 Word.doc,它只会被加载一次,如果是 pdf,它会被加载两次。此外,我从不同的客户端桌面看到了不同的行为。我在想 Adob​​e 版本可能与它有关。

更新:

就我而言,我将 HttpCacheability 设置为 NoCache。在验证这一点时,任何非客户端缓存选项都会导致 pdf 的双重下载。只有完全不设置(默认为私有)或明确将其设置为私有或公共才能解决问题,所有其他设置都重复了文档的双重加载。

于 2009-04-22T11:52:13.920 回答