ASP.Net 导出 CSVHelper 文件 - 清理

ASP.Net Export CSVHelper File - Cleanup

csvhelper 的新手,试图确保我在用户下载文件后清除 up\close 所有连接,不确定我是否正确完成,有人可以建议我需要做什么吗?

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");                    
}

MemoryStreamStreamWriterCsvWriter都实现了IDisposable。那么,让我们一次一个地处理它们:

首先,MemoryStream

FileStreamResultwill dispose of the provided stream for you,这是controller最后调用File的结果

接下来,StreamWriter

通常,您需要自行处理,例如using 语句。在您的示例中,处理 CsvWriter 实际上会为您执行此操作。但是,有一个陷阱。默认:

The StreamWriter object calls Dispose() on the provided Stream object when StreamWriter.Dispose is called.

有一个 constructor overload 允许底层 Stream 保持打开状态。你需要使用它;否则,MemoryStream 将在 FileStreamResult 获取它之前被处理掉,你将得到可怕的 "object already disposed" 异常。

最后,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 标志的构造函数,因此您必须使用我在上面使用的那个。 1024 是默认值,但 Encoding.UTF8slightly different。它应该足够了,但也许其他人会出现并指出如何更好地处理它。