【问题标题】:ASP.Net Export CSVHelper File - CleanupASP.Net 导出 CSVHelper 文件 - 清理
【发布时间】:2018-04-08 14:56:09
【问题描述】:

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

【问题讨论】:

    标签: c# asp.net-mvc csvhelper


    【解决方案1】:

    MemoryStreamStreamWriterCsvWriter 都实现了IDisposable。所以,让我们一次拿一个:

    首先,MemoryStream

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

    【讨论】:

    • 附加说明:写入MemoryStream 可能对于大文件效率有点低(数据被写入内存,然后复制到 HTTP 响应中)。使用 ASP.NET,您可以直接写入响应流,这样就不需要临时 MemoryStream。我认为这超出了这个关于资源处置问题的范围,但考虑一下很有用。
    猜你喜欢
    • 2022-10-04
    • 2013-04-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多