【发布时间】:2018-05-13 18:19:25
【问题描述】:
我有一个数据库,其中有一个表,其中包含大约 20 列的超过 200 万条记录。用户可以查询数据库并限制返回的记录数,因此记录集可能在 1 到 200 万之间。
由于它是表格信息,我想以 CSV 格式发送数据。我正在使用 StreamWriter 将数据写入内存,一旦文件完成,我会将其作为 HttpResponseMessage 发送。我的代码在下面,只要我没有耗尽内存,它就可以正常工作。有没有办法让我在处理文件时对其进行流式传输,以使使用的内存最少?
<HttpGet, Route("api/records/export")>
Public Function ExportRecords() As HttpResponseMessage
Dim stream As New MemoryStream
Dim writer As New StreamWriter(stream)
writer.WriteLine("")
' Processing of data here
writer.WriteLine("""Write Data to MemoryStream"")
writer.Flush()
stream.Position = 0
Dim result As New HttpResponseMessage(HttpStatusCode.OK)
result.Content = New StreamContent(stream)
result.Content.Headers.ContentType = New Headers.MediaTypeHeaderValue("text/csv")
result.Content.Headers.ContentDisposition = New Headers.ContentDispositionHeaderValue("attachment") _
With {.FileName = "I" & Format(Date.Now, "yyMMdd") & ".csv"}
Return result
End Function
我在 StackOverflow 上阅读了对 Returning binary file from controller in ASP.NET Web API 等问题的回答,但这些都涉及从存储在磁盘上的文件而不是从内存中流式传输 Web 响应。
【问题讨论】:
-
你可以只写到 Response.OutputStream 并跳过内存流。
-
您可以使用链接示例中的 PushStreamContent,您只需将 MemorySteam 替换为 PushStreamContent 中的流参数并省略
stream.Position = 0语句。它会是这样的(请原谅我在这里使用 C#):result.Content = new PushStreamContent((stream, httpContent, transportContext) => { var writer = new StreamWriter(stream); \* Rest of your code *\ writer.Flush(); stream.Close(); })m "text/csv");
标签: asp.net vb.net csv asp.net-web-api streamwriter