Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/323.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# ASP.Net导出CSVHelper文件-清理_C#_Asp.net Mvc_Csvhelper - Fatal编程技术网

C# ASP.Net导出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

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

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,您可以直接写入响应流,这将减少对临时
内存流的需要。我认为这超出了资源配置问题的范围,但这是值得考虑的。