C# 响应传输文件-未发生任何事件 关于Response.TransmitFile的帮助

C# 响应传输文件-未发生任何事件 关于Response.TransmitFile的帮助,c#,asp.net,httpresponse,C#,Asp.net,Httpresponse,在发布之前,我在这里搜索并找到了几个类似的帖子 其中解决方案包括Response.End() 好吧,我已经包括了最后一行,但仍然没有发生任何事情 我甚至在ASPX页面的主体中包含了一个,但也没有写入任何内容 public void DownloadFile(string nameOnly) { if (!String.IsNullOrEmpty(nameOnly)) { lblErrMsg.Text = "Transfer request for " + nameOnly;

在发布之前,我在这里搜索并找到了几个类似的帖子

其中解决方案包括
Response.End()

好吧,我已经包括了最后一行,但仍然没有发生任何事情

我甚至在ASPX页面的主体中包含了一个
,但也没有写入任何内容

public void DownloadFile(string nameOnly) {
  if (!String.IsNullOrEmpty(nameOnly)) {
    lblErrMsg.Text = "Transfer request for " + nameOnly;
    string filename = Server.MapPath(nameOnly);
    try {
      if (!String.IsNullOrEmpty(filename)) {
        Response.Buffer = true;
        Response.Clear(); // clear the buffer
        Response.Cache.SetCacheability(HttpCacheability.NoCache);
        if (-1 < filename.IndexOf(".avi")) {
          Response.ContentType = "video/x-msvideo";
          lblErrMsg.Text = "Content Type Set to Video.";
        } else if (-1 < filename.IndexOf(".pdf")) {
          Response.ContentType = "Application/pdf";
          lblErrMsg.Text = "Content Type Set to PDF.";
        } else if (-1 < filename.IndexOf(".rar")) {
          Response.ContentType = "Application/x-rar-compressed";
          lblErrMsg.Text = "Content Type Set to RAR.";
        } else {
          Response.ContentType = "Application/octet-stream";
          lblErrMsg.Text = "Content Type Set to Octet Steam.";
        }
        FileInfo file = new FileInfo(filename);
        Response.AddHeader("Content-Disposition", "attachment; filename=" + nameOnly);
        Response.AddHeader("Content-Length", file.Length.ToString());
        lblErrMsg.Text = "Content Headers added.";
        Response.TransmitFile(file.FullName);
        lblErrMsg.Text = "Transfer Completing...";
        Response.End();
        lblErrMsg.Text = "Transfer Complete.";
      } else {
        throw new Exception(string.Format("Server was unable to locate file \"{0}\".", nameOnly));
      }
    } catch (Exception err) {
      lblErrMsg.Text = err.Message;
    }
  }
}

尝试理解您有一条返回到浏览器数据的管道

在您的代码中,您的行为就像您发回了两种数据,一种发送到页面,另一种发送到下载数据,但实际上您不能这样做。就像你试图在两个不同的文件上写东西——一个流打开一个文件

因此,选择以太发送文件,以太更新页面

我在这里描述了我认为下载文件的最佳方式:



事实上,我在这之后添加了
lblErrMsg
标签,以便调试并查看下载停止的位置。它仍然不能下载。@jp2code您不能同时使用页面更新和文件下载。只保留一个。@jp2codein通常最好使用处理程序,原因有很多,其中之一是您的文件可能再次从页面的gZip压缩传递并中断。还有可能在你的磁盘上找不到,你有没有检查过?。而且最好使用
.Flush()
而不是.End()@jp2code,并确保关闭缓冲区<代码>Response.Buffer=false缓冲区意味着首先将文件放在内存中,然后尝试以一个一个的方式发送,这可能会导致大量数据丢失,当我们一点一点地呈现一个页面时,缓冲区变为true,我们希望将其全部显示给用户。@jp2code缓冲区=false首先显示,最后刷新显示。
传输文件
在文件结束后也使用刷新。冲洗是在不关闭连接的情况下,尝试在管道上发送任何东西。
private string Download(string nameOnly) {
  string outputLine = null;
  if (!String.IsNullOrEmpty(nameOnly)) {
    string filename = Server.MapPath(nameOnly);
    if (!String.IsNullOrEmpty(filename)) {
      try {
        Response.Buffer = false;
        Response.Clear(); // clear the buffer
        Response.Cache.SetCacheability(HttpCacheability.NoCache);
        if (-1 < filename.IndexOf(".avi")) {
          Response.ContentType = "video/x-msvideo";
        } else if (-1 < filename.IndexOf(".pdf")) {
          Response.ContentType = "Application/pdf";
        } else if (-1 < filename.IndexOf(".rar")) {
          Response.ContentType = "Application/x-rar-compressed";
        } else {
          Response.ContentType = "Application/octet-stream";
        }
        FileInfo file = new FileInfo(filename);
        Response.AddHeader("Content-Disposition", "attachment; filename=" + nameOnly);
        Response.AddHeader("Content-Length", file.Length.ToString());
        Response.TransmitFile(file.FullName);
      } catch (Exception err) {
        outputLine = err.Message;
      } finally {
        Response.Flush();
      }
    } else {
      outputLine = string.Format("Server was unable to locate file \"{0}\".", nameOnly);
    }
  }
  if (String.IsNullOrEmpty(outputLine)) {
    Response.Redirect("~/Default.aspx");
  }
  return outputLine;
}