我有一个按钮,单击该按钮将生成PDF并将其写入响应。
这是代码的基本结构:
try
{
using(Stream stream = generatePdf())
{
var file = createFile(stream);
file.Transmit(HttpContext.Current.Response);
}
}
catch (Exception ex)
{
// Handle exception
// Display Error Message
}
传输方法包含以下代码:
response.AddHeader("Content-Disposition", String.Format("attachment; filename={0}", filename));
response.AddHeader("Content-Length", bytes.Length.ToString());
response.ContentType = "application/octet-stream";
response.BinaryWrite(bytes);
下载文件可以正常工作,但不能完成回发。
如果我要在file.Transmit
之上抛出异常,错误处理将正常工作,我会看到消息在我的浏览器中显示。但是,如果在file.Transmit
之后发生异常则没有任何反应。用户保存/打开pdf,页面不会重新加载。
如何才能使回发始终完成,这样我可以向用户显示相应的消息?
答案 0 :(得分:4)
听起来你正试图让响应包含两部分:页面和 PDF。你不能这样做。通常下载页面会在您访问它们时(通过JavaScript,我相信)以单独的请求开始下载,并提供直接链接以防JavaScript无效。
任何一个HTTP请求只能有一个响应。
答案 1 :(得分:1)
Response.End()从字面上结束整个响应。
我使用它时有两种方法:
1)始终确保它是回发中的最终要求点。
2)(以及使用AJAX进行文件调用的唯一方法)在iframe中创建一个小页面仅用于发送文件并在帧上调用刷新... response.end将结束响应从那个框架,而不是整个回发。
编辑:这是关于同一主题的问题主题 Using Response.TransmitFile for physical file not working