在打开文件之前,下载Office文件会导致aspx页面重新加载三次

时间:2012-04-20 11:28:40

标签: asp.net ms-office download

我有一个允许从服务器下载文件的Web应用程序。文档可能是Office文件(.docx,pptx,.xslx)或Pdf。

逻辑很简单:从客户端点击一个Web服务,调用一个aspx页面(Print.aspx)传递所需的参数。打印页面调用Web服务以检索所选文档二进制文件并将其写入响应:

protected void Page_Load(object sender, EventArgs e)
    {
        string fileName = Request.QueryString["fname"];
        if (string.IsNullOrEmpty(documentID) == false)
        {
            byte[] document = GetPhysicalFile(documentID); //Get the binaries
            showDownloadedDoc(document, fileName);
        }
    }

private void showDownloadedDoc(byte[] document, string fileName)
{
Response.Clear();
Response.ContentType = contentType;

Response.AppendHeader("content-disposition", string.Format("attachment; filename=\"{0}\"", fileName));
Response.BufferOutput = false;
Response.BinaryWrite(document);
Response.Close();

 }

Pdf文档在Print.aspx页面中打开,aspx页面只加载一次。对于Office文件,Page_Load()方法被调用3次。

第一次打开/保存文档对话框后,如果单击“打开”,则会调用Page_Load两次,然后文档最终会在MS Word中显示。

有没有办法阻止多个页面加载来打开这些文档?我希望避免将文件保存在服务器端并重定向到该URL,因为将创建每个访问的文件。

2 个答案:

答案 0 :(得分:1)

我怀疑你通过点击回发邮件,然后你不要让回复重播,以通知ViewState命令已完成并更新页面上的内容。

所以在下一次单击时,旧命令仍在等待并按页重新发送,现在你有两个命令 - 两个调用,但是你再次不让返回更新视图状态,页面认为必须再等一下。

接下来每次调用都会继续,后面的代码实际上是尝试运行前一个调用。

对此的解决方案是直接链接到处理程序,而不是使用ajax从后面的代码中调用它。

答案 1 :(得分:1)

以下是GenericHandler

的示例
public void ProcessRequest(HttpContext context)
{

  string filePath; // get from somewhere
  string contentType; // get from somewhere

  FileInfo fileInfo = new FileInfo(filePath);

  context.Response.Clear();
  context.Response.ContentType = contentType;
  context.Response.AddHeader("content-disposition", "attachment; filename=" + Path.GetFilename(filePath));
  context.Response.AddHeader("Content-Length", fileInfo.Length.ToString());
  context.Response.TransmitFile(filePath);
}