【问题标题】:Downloading a file, can you cancel the response when an error occurs, without buffering the content下载文件,是否可以在出错时取消响应,不缓冲内容
【发布时间】:2015-12-21 14:45:22
【问题描述】:

我正在将大型 CSV 文件写入响应,并将 Response.BufferOutput 设置为 false。这是因为文件可能需要很长时间才能下载,因此用户可以看到一些进度。我从一个对象为 CSV 生成一行,并使用 Response.Write() 写入响应。

这很有效,但是如果在响应开始写入后出现意外错误,那么客户端将收到一个仅包含部分数据的文件,并且可能会丢失很多行,但他们可能没有意识到这一点。

有没有办法在不缓冲所有内容的情况下以某种方式取消文件下载?是否可以通过某种方式表明响应无效,以便浏览器忽略该文件?

下面的代码展示了我的代码的主要思想

public void StreamCsvFile(string fileName,List<myObject> myObjectList)
{
   Response.Clear();

   Response.ContentType = "text/csv";
   Response.AddHeader("content-disposition", "filename=" + fileName);
   Response.BufferOutput = false;

   string headerLine = GetHeaderLine();
   Response.Write(headerLine)

   try
   {
      foreach(var myObject in myObjectList)
      {
        string line = myObject.ToCsvString();

        Response.Write("\n" + line);
      }
   }
   finally
   {
     Response.End();
   }    
}

【问题讨论】:

  • 您是否尝试过抛出异常(而不是捕获它)?

标签: c# asp.net asp.net-mvc file httpresponse


【解决方案1】:
  • 先写入临时文件。
  • 设置响应的内容长度。
  • 使用 Response.TransmitFile 发送此临时文件。
  • 如果内容长度不匹配,浏览器将拒绝下载。

【讨论】:

  • 写入临时文件并不能解决让用户看到一些即时反馈的问题。它类似于或比缓冲输出更差。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-22
  • 1970-01-01
  • 2010-09-16
  • 1970-01-01
相关资源
最近更新 更多