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");
}
MemoryStream
、StreamWriter
和CsvWriter
都实现了IDisposable
。那么,让我们一次一个地处理它们:
首先,MemoryStream
FileStreamResult
will 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
没有允许您只提供 Stream
和 leaveOpen
标志的构造函数,因此您必须使用我在上面使用的那个。 1024
是默认值,但 Encoding.UTF8
是 slightly different。它应该足够了,但也许其他人会出现并指出如何更好地处理它。
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");
}
MemoryStream
、StreamWriter
和CsvWriter
都实现了IDisposable
。那么,让我们一次一个地处理它们:
首先,MemoryStream
FileStreamResult
will 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
没有允许您只提供 Stream
和 leaveOpen
标志的构造函数,因此您必须使用我在上面使用的那个。 1024
是默认值,但 Encoding.UTF8
是 slightly different。它应该足够了,但也许其他人会出现并指出如何更好地处理它。