【问题标题】:Downloading Office file causes aspx page reload three times before opening the file下载 Office 文件会导致 aspx 页面在打开文件之前重新加载 3 次
【发布时间】:2012-04-20 20:21:05
【问题描述】:

我有一个允许从服务器下载文件的网络应用程序。文档可能是 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 次。

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

有没有一种方法可以防止在打开这些文档时加载多个页面?我想避免将文件保存在服务器端并重定向到该 URL,因为每次访问都会创建一个文件。

【问题讨论】:

  • 您是否有理由不为此使用GenericHandler?灰烬
  • 我认为使用我的方法将是实现让用户下载文档需求的最简单方法(应用程序仅用于公司的内部网)。 GenericHandler 如何解决我当前的多页面加载问题?
  • 使用 genericHandler 我不会拥有与 aspx 页面相同的 LifeCicle(+1,好主意)。
  • 只是创建一个下载,您可能不需要asp Page LifeCycle,对吗? LifeCycle 用于生成 WebForms。上面的示例代码与 WebForms 无关,使用 GenericHandler 可能会快很多。此外,您将不再有 Page_Load 事件,因此不能多次调用它。这对我来说似乎很容易解决,但显然你没有使用 GenericHandler 是有充分理由的。
  • 我添加了一个带有 GenericHandler 的示例。

标签: asp.net ms-office download


【解决方案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);
}

【讨论】:

  • 我会在接受答案之前等待,看看是否找到了适合我的案例的解决方案。无论如何,对于好的提示和代码来说,另一个 +1。
【解决方案2】:

我怀疑您通过单击回发,然后避免让响应重播以通知 ViewState 命令已完成并更新页面上的内容。

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

这在每次下一次调用时都会继续,后面的代码实际上是尝试运行所有前一个。

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

【讨论】:

  • 实际上,每次单击按钮都会加载 3 次页面(即使是在 IIS 重置和代码部署后的第一次单击时)。但是我正在实现一个 GenericHandler.ashx 而不是 aspx 页面,看看这是否有帮助。
  • @luca 如果你有放置代码我可能有更好的图像寻求帮助。
  • 我在问题中添加了用于在检索到后将二进制文件发送到客户端的代码。
  • @Luca 你看,你做的正是/几乎我所说的。你不能那样做,你必须找到不同的方法。回发必须继续并以重播结束。直接使用处理程序和指向您想要下载的内容的链接。
  • +1 - 正如上面写给 Bazzz 的那样,不幸的是我不能使用 GenericHandler。
猜你喜欢
  • 2011-08-22
  • 1970-01-01
  • 1970-01-01
  • 2016-02-25
  • 1970-01-01
  • 2013-08-22
  • 2014-10-22
  • 2018-12-24
相关资源
最近更新 更多