2009-01-19 128 views
0

此代码将始终使我的aspx页面加载两次。这与AutoEventWireup无关。C#写入输出流

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"/> 

还没有。任何人都看到我不喜欢的东西?

+0

此代码在哪里? – 2009-01-19 00:37:58

回答

0

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

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

更新:

在我来说,我设置了HttpCacheability为nocache。在验证这一点时,任何非客户端缓存选项都会导致pdf的双重下载。只是根本不设置它(默认为私有)或明确地将其设置为私有或公开将会解决该问题,所有其他设置都会重复该文档的双重负载。

1
GetDocument(doclocation); 

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

如果是这样的:

一般控制能拿因为URL响应的叫了两声。首先它呈现内容。之后,您的浏览器尝试下载实际上是生成的动态内容的标记(iframe,img)源。所以它向Web服务器发出了另一个请求。在这种情况下,创建另一个页面对象具有不同的视图状态,因为它是一个不同的请求。

0

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

0

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