C# ASP.Net导出CSVHelper文件-清理
csvhelper新手,试图确保在用户下载文件后我清理\关闭所有连接,不确定我是否做对了,有人能建议我需要做什么吗C# ASP.Net导出CSVHelper文件-清理,c#,asp.net-mvc,csvhelper,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 str
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
都实现了。所以,让我们一次只取一个:
首先是MemoryStream
FileStreamResult
,它是在控制器末尾调用File
的结果
接下来是StreamWriter
通常,您需要自己处理此问题,例如使用语句。在您的示例中,处理CsvWriter
实际上可以为您做到这一点。然而,有一个陷阱。默认情况下:
调用StreamWriter.Dispose时,StreamWriter对象对提供的流对象调用Dispose()
有一个允许底层流
保持打开状态的。你需要使用这个;否则,MemoryStream
将在FileStreamResult
抓住它之前被释放,您将得到可怕的“object ready 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
。这应该足够了,但可能会有其他人来指出如何更好地处理它。作为补充说明:对于大型文件而言,写入MemoryStream
可能有点效率低下(数据写入内存,然后复制到HTTP响应)。使用ASP.NET,您可以直接写入响应流,这将减少对临时内存流的需要。我认为这超出了资源配置问题的范围,但这是值得考虑的。