下载文件,可以在发生错误时取消响应,而不缓​​冲内容

时间:2015-12-21 14:45:23

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

我正在将大型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();
   }    
}

1 个答案:

答案 0 :(得分:0)

  • 首先写入临时文件。
  • 在响应中设置内容长度。
  • 使用Response.TransmitFile发送此临时文件。
  • 如果内容长度不匹配,浏览器将拒绝下载。