Asp.net 流式pdf失败-找不到文件
今天早上,我花了一些时间试图帮助一位同事解决一个奇怪的问题,目前我们三个人都被这个问题难住了。我们正在开发一个允许用户将pdf文件附加到数据记录的系统。系统使用服务从服务器存储和检索文件,并在附件表中存储标识符,以指示哪些文件属于哪些记录 然后,在应用程序中的两个不同页面上,我们有一个网格,显示记录的附件列表。网格中有链接按钮,允许用户打开给定的附件。“链接”按钮引发一个命令事件,该事件将附件的标识符作为其参数传递。在命令事件处理程序中,我们从参数中获取标识符,使用它以字节数组的形式从服务中检索附件,然后重写响应对象以返回附件。代码如下:Asp.net 流式pdf失败-找不到文件,asp.net,pdf,streaming,Asp.net,Pdf,Streaming,今天早上,我花了一些时间试图帮助一位同事解决一个奇怪的问题,目前我们三个人都被这个问题难住了。我们正在开发一个允许用户将pdf文件附加到数据记录的系统。系统使用服务从服务器存储和检索文件,并在附件表中存储标识符,以指示哪些文件属于哪些记录 然后,在应用程序中的两个不同页面上,我们有一个网格,显示记录的附件列表。网格中有链接按钮,允许用户打开给定的附件。“链接”按钮引发一个命令事件,该事件将附件的标识符作为其参数传递。在命令事件处理程序中,我们从参数中获取标识符,使用它以字节数组的形式从服务中检索
byte[] byteFile = DataHandler.GetAttachmentDocument(selectedAttachmentID);
if (DataHandler.sErrorMsg != "")
{//Error trying to retrieve file...
this.DisplayMessageBox(DataHandler.sErrorMsg);
}
else
{//File retrieved...
Response.Clear();
Response.Buffer = true;
Response.ContentType = "application/pdf";
Response.AddHeader("content-disposition", "attachment;filename=" + lblAttachmentName.Text);
Response.Charset = "";
Response.Cache.SetCacheability(HttpCacheability.NoCache);
Response.BinaryWrite(byteFile);
Response.Flush();
Response.Close();
Response.End();
}
现在这个完全相同的代码在一个页面上完美地工作,而在另一个页面上却失败了。在这两种情况下,当单击按钮并显示下载对话框时,单击打开按钮并打开adobe reader窗口。在工作页面上,reader窗口显示请求的文档,但在另一页面上,我们从reader窗口中得到一个错误,说明:打开此文档时出错。找不到此文件。
在调试器中运行时,我们可以单步执行,并查看byteFile中的字节数是否相同,以及是否在执行完整方法时没有错误
我们在谷歌上搜索了很多,并尝试了一些代码的变体,但没有任何运气。我知道我们尝试过的几件事是将内容类型更改为八位字节流,将内容长度添加到标头,将缓冲区更改为false,删除内容处置属性。唯一明显不同的是删除了contentdisposition属性,在这种情况下,文档显示在原始窗口中,而不是单独的adobereder窗口中。另一个已经提出但尚未尝试的想法是将网格和相关逻辑提取到web控件中,然后在两个页面上重用该控件。还有其他建议吗?不要使用Response.Close()和Response.End()。Flush()就足够了
原因如下:虽然我们一直无法准确找出问题的原因,但我们确实确定它至少在某种程度上是用户/机器特定的。因此,我们最好的猜测是客户端存在某种奇怪的冲突或缓存问题 我们最终做的是开发一个空白页面,该页面接受查询字符串上的附件ID和名称,执行一些安全检查,然后返回请求的附件。这给了我们一个单一的、可重用的、包含附件检索代码的模块 然后,我们进入提供附件的页面,将网格模板从带有命令参数的链接按钮更改为超链接,超链接的导航URL绑定到新页面的路径+查询字符串参数,目标为
\u blank
最终的结果是,我们消除了错误,没有对页面结构进行重大更改,保持了所需的最终用户体验,并且拥有了一个更易于维护的代码结构
谢谢莱昂的提示。虽然它没有解决问题,但它确实帮助我们清理了代码。我们尝试了您的建议,我发现还有一些人在探索您的链接。仍然存在相同的问题,一个页面包含代码,而另一个页面没有。您是否尝试显式清除响应标题
Response.Headers.Clear()
另外,请检查lblatachmentname.Text
的内容-可能是文件名用不寻常的字符(?)将其搞乱了。