C# 在API请求返回文件后删除该文件

C# 在API请求返回文件后删除该文件,c#,asp.net-mvc,dispose,abp,C#,Asp.net Mvc,Dispose,Abp,我收到一个请求,用它创建一个文件并将其返回给客户端 文件发送后,我希望将其删除 由于我收到很多请求,文件很大,内存不足,所以我不想在内存中缓冲发送请求 我唯一不用在内存中缓冲整个文件的方法是: Response.TransmitFile(文件路径) 问题是它是异步执行的,因此如果在调用之后删除它,文件下载就会中断 我试着调用Flush,在finally块上添加delete,但这两个都不起作用。我曾想过继承HttpResponse来尝试修改TransmitFile,但它是一个密封的类。我尝试使用H

我收到一个请求,用它创建一个文件并将其返回给客户端

文件发送后,我希望将其删除

由于我收到很多请求,文件很大,内存不足,所以我不想在内存中缓冲发送请求

我唯一不用在内存中缓冲整个文件的方法是:

Response.TransmitFile(文件路径)

问题是它是异步执行的,因此如果在调用之后删除它,文件下载就会中断

我试着调用Flush,在finally块上添加delete,但这两个都不起作用。我曾想过继承HttpResponse来尝试修改TransmitFile,但它是一个密封的类。我尝试使用HttpResponse.ClientDisconnectedToken,但要么我不知道如何正确使用它,要么在这种情况下它不起作用

我怎样才能做到这一点?有没有比调用HttpResponse的TransmitFile更好的方法?始终考虑到这是一个API,文件不能被分解为不同的请求,并且它不会在内存中加载完整的文件


我不确定它是否有帮助,但我的控制器是从ABPAPI控制器继承的。

如果在临时文件夹中创建文件,只需创建一个作业,根据日期/时间删除所有文件即可。可能给用户4小时下载该文件。

您可以从文件中创建一个字节数组,然后删除该文件。 因此,一旦创建了该文件,就将其存储在内存中,然后删除该文件并返回字节数组。 检查


我希望这会有所帮助。

作为TransmitFileWithLimit的一个实现,它可以在许多方面进行改进,但它是有效的

HttpResponse的扩展

public static class HttpResponseExtensions
{
    public static void TransmitFileWithLimit(this HttpResponse response, string path, int limit)
    {
        var buffer = new byte[limit];
        var offset = 0;
        response.ClearContent();
        response.Clear();
        response.ContentType = "text/plain";

        using (var fileStream = File.OpenRead(path))
        {
            var lengthStream = fileStream.Length;
            while (offset < lengthStream)
            {
                var lengthBytes = fileStream.Read(buffer, 0, limit);
                var chars = System.Text.Encoding.ASCII.GetString(buffer, 0, lengthBytes).ToCharArray();
                response.Write(chars, 0, lengthBytes);
                offset += lengthBytes;
            }
        }
        response.Flush();
        response.End();
    }
}

看看这里:我甚至不知道不把数据先放进内存就可以把数据放在电线上,每天学习新的东西!在异步调用中使用
await
关键字暂停执行,直到方法returns在客户端请求时删除该文件或将其置于计时器上。你不应该认为它成功地到达了那里。@tgralex谢谢你,但正如我所写的,我尝试了finally block选项。不起作用。它会在传输文件之前删除该文件。另一个答案在内存中缓冲响应。@ošoħWilliard嗯,可以用更好的措辞。如果是1GB文件,RAM的使用量不会增加到任何明显的数量。TransmitFile不是一个异步方法,不能等待。这是我想到的最好的方法,但我希望在不再需要该文件后不久删除该文件。由于知道一些客户端的处理速度很慢,因此应该将所有文件保留20多个小时,这对大多数客户端来说是完全不必要的。我也更喜欢这种方法,特别是因为您不会浪费内存将文件的全部内容加载到内存中。您可以安排一个简单的作业,每天运行一次,以删除和清理临时文件夹。我会引用自己的话:“我不想在内存中缓冲它来发送它”谢谢
    public void Get()
    {
        var path = @"C:\temporal\bigfile.mp4";
        var response = HttpContext.Current.Response;
        response.ClearContent();
        response.Clear();
        response.AddHeader("Content-Disposition", "inline; filename=" + HttpUtility.UrlPathEncode(path));
        response.ContentType = "text/plain";
        response.AddHeader("Content-Length", new FileInfo(path).Length.ToString());
        response.Flush();
        HttpContext.Current.ApplicationInstance.CompleteRequest();

        TransmitFileWithLimit(path, 10000);
        File.Delete(path);
    }