ASP.Net导出CSVHelper文件 - 清理

时间:2018-04-08 14:56:09

标签: c# asp.net-mvc csvhelper

csvhelper新手,试图确保我清理\用户下载文件后关闭所有连接,不确定我是否做得对,有人可以建议我需要做什么吗?

public ActionResult ExportClients()
{
    var token = new Token(this.User.Identity.Name);
    var clients =_clientService.Get(toekn.Id);

    var memoryStream = new MemoryStream();
    var streamWriter = new StreamWriter(memoryStream);
    var csvWriter = new CsvWriter(streamWriter);

    csvWriter.WriteRecords(clients);
    streamWriter.Flush();
    memoryStream.Position = 0;

    return File(memoryStream, "text/csv","clients.csv");                    
}

1 个答案:

答案 0 :(得分:1)

MemoryStreamStreamWriterCsvWriter全部实施IDisposable。所以,让我们一次拿一个:

首先,MemoryStream

FileStreamResult will dispose of the provided stream for you,这是在控制器末尾调用File的结果。

接下来是StreamWriter

通常情况下,您需要自行处理此类问题,例如:一个using声明。在您的示例中,处理CsvWriter实际上会为您执行此操作。但是,有一个问题。默认情况下:

  

当调用StreamWriter.Dispose时,StreamWriter对象在提供的Stream对象上调用Dispose()。

constructor overload允许底层Stream保持打开状态。你需要使用它;否则,MemoryStream会在FileStreamResult抓住它之前被处理掉,并且你会得到已经处置的可怕对象"异常。

最后,CsvWriter

这是最简单的情况 - 你可以自己处理它,例如using声明。

这是一个令人尊敬的代码:

var memoryStream = new MemoryStream();
var streamWriter = new StreamWriter(memoryStream, Encoding.UTF8, 1024, true);

using (var csvWriter = new CsvWriter(streamWriter))
{
    csvWriter.WriteRecords(clients);
    // No need to flush as the StreamWriter's Dispose takes care of that.
}

memoryStream.Position = 0;

return File(memoryStream, "text/csv","clients.csv");

不幸的是,StreamWriter的构造函数没有允许您只提供StreamleaveOpen标记,所以你必须使用我的#{1}}和1024标记。以上使用过的。 Encoding.UTF8是默认值,但<window>slightly different。它应该足够了,但也许其他人会出现并指出如何更好地处理它。

相关问题