在将文件写入响应后,有没有办法完成回发?

时间:2011-01-28 21:18:44

标签: c# asp.net httpresponse .net-3.5

我有一个按钮,单击该按钮将生成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,页面不会重新加载。

如何才能使回发始终完成,这样我可以向用户显示相应的消息?

2 个答案:

答案 0 :(得分:4)

听起来你正试图让响应包含两部分:页面 PDF。你不能这样做。通常下载页面会在您访问它们时(通过JavaScript,我相信)以单独的请求开始下载,并提供直接链接以防JavaScript无效。

任何一个HTTP请求只能有一个响应。

答案 1 :(得分:1)

Response.End()从字面上结束整个响应。

我使用它时有两种方法:

1)始终确保它是回发中的最终要求点。

2)(以及使用AJAX进行文件调用的唯一方法)在iframe中创建一个小页面仅用于发送文件并在帧上调用刷新... response.end将结束响应从那个框架,而不是整个回发。

编辑:这是关于同一主题的问题主题 Using Response.TransmitFile for physical file not working