Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/320.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net 流式pdf失败-找不到文件_Asp.net_Pdf_Streaming - Fatal编程技术网

Asp.net 流式pdf失败-找不到文件

Asp.net 流式pdf失败-找不到文件,asp.net,pdf,streaming,Asp.net,Pdf,Streaming,今天早上,我花了一些时间试图帮助一位同事解决一个奇怪的问题,目前我们三个人都被这个问题难住了。我们正在开发一个允许用户将pdf文件附加到数据记录的系统。系统使用服务从服务器存储和检索文件,并在附件表中存储标识符,以指示哪些文件属于哪些记录 然后,在应用程序中的两个不同页面上,我们有一个网格,显示记录的附件列表。网格中有链接按钮,允许用户打开给定的附件。“链接”按钮引发一个命令事件,该事件将附件的标识符作为其参数传递。在命令事件处理程序中,我们从参数中获取标识符,使用它以字节数组的形式从服务中检索

今天早上,我花了一些时间试图帮助一位同事解决一个奇怪的问题,目前我们三个人都被这个问题难住了。我们正在开发一个允许用户将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
的内容-可能是文件名用不寻常的字符(?)将其搞乱了。