C#写入输出流

C#写入输出流,c#,asp.net,load,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); Re

此代码将始终使我的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"/>

还是没什么。有人看到我没有看到的东西吗

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

如果是:


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

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

您在页面加载中尝试过吗?为什么GetDocument是一种静态方法?

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

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

更新:

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

GetDocument()看起来像什么?GetDocument()简单地将PDF文档作为字节数组返回。对响应没有任何修改。