【发布时间】:2019-12-31 00:17:05
【问题描述】:
我收到一个请求,我使用该请求创建一个文件并将其返回给客户端。
文件发送后我希望将其删除。
由于我收到很多请求,文件很大,内存不足,我不想将它缓冲在内存中发送。
在内存中不缓冲整个文件的情况下,我可以使用的唯一方法是:
Response.TransmitFile(filepath)
问题在于它是异步执行的,所以如果我在调用之后删除它,文件下载就会中断。
我尝试调用 Flush,在 finally 块上添加删除,但这些都不起作用。想过继承HttpResponse来尝试修改TransmitFile,但它是一个密封类。我尝试使用 HttpResponse.ClientDisconnectedToken 但要么我不明白如何正确使用它,要么在这种情况下它不起作用。
我怎样才能做到这一点?有比调用 HttpResponse 的 TransmitFile 更好的方法吗?始终考虑到这是一个 API,不能将文件分解为不同的请求,并且 它不会将完整的文件加载到内存中。
我不确定它是否有帮助,但我的控制器是从 AbpApiController 继承的。
【问题讨论】:
-
我什至不知道可以在不先将数据放入内存的情况下将数据放到网络上,每天学习新东西!在异步调用上使用
await关键字来暂停执行,直到方法返回 -
我会在客户端请求文件时删除文件或将其放在计时器上。你永远不应该认为它成功了。
-
@tgralex 谢谢,但正如我所写,我尝试了 finally 块选项。不工作。它会在文件传输之前将其删除。另一个答案在内存中缓冲响应。
-
@ĴošħWilliard 好吧,它的措辞可以更好。如果它是一个 1GB 的文件,那么 RAM 使用量不会上升到任何明显的量。 TransmitFile 不是异步方法,不能等待。
标签: c# asp.net-mvc dispose abp