C#写入输出流

时间:2009-01-19 00:15:54

标签: c# asp.net load

此代码将始终使我的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文件中增加了for measure的请求长度。

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

仍然没有。有人看到我不喜欢的东西吗?

4 个答案:

答案 0 :(得分:1)

GetDocument(doclocation);

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

如果是这样:

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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

答案 3 :(得分:0)

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

我找到了有趣的线索: 如果我流回Word.doc它只加载一次,如果pdf加载两次。此外,我看到了不同客户端桌面的不同行为。我认为Adobe版本可能与它有关。

<强>更新

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