Как удалить файл, который был отправлен как StreamContent HttpResponseMessage

In ASP.NET webapi, я отправляю временный файл клиенту. Я открываю поток для чтения файла и использую StreamContent в HttpResponseMessage. Как только клиент получит файл, я хочу удалить этот временный файл (без какого-либо другого вызова от клиента) Как только клиент получает файл, вызывается метод Dispose HttpResponseMessage и поток также удаляется. Теперь я также хочу удалить временный файл, на данный момент.

один из способов сделать это, чтобы получить класс из класса HttpResponseMessage переопределяет метод Dispose, удаляет этот файл и вызывает метод dispose базового класса. (Я еще не пробовал, поэтому не знаю, работает ли это наверняка)

Я хочу знать, есть ли лучший способ достичь этого.

3 ответов


на самом деле комментарий помог решить вопрос... Я написал об этом здесь:

удалить временный файл, отправленный через StreamContent в ASP.NET Web API HttpResponseMessage

вот что сработало для меня. Обратите внимание, что порядок вызовов внутри Dispose отличается от вашего комментария:

public class FileHttpResponseMessage : HttpResponseMessage
{
    private string filePath;

    public FileHttpResponseMessage(string filePath)
    {
        this.filePath = filePath;
    }

    protected override void Dispose(bool disposing)
    {
        base.Dispose(disposing);

        Content.Dispose();

        File.Delete(filePath);
    }
}

создайте StreamContent из FileStream с опцией DeleteOnClose.

return new HttpResponseMessage(HttpStatusCode.OK)
{
    Content = new StreamContent(
        new FileStream("myFile.txt", FileMode.Open, 
              FileAccess.Read, FileShare.None, 4096, FileOptions.DeleteOnClose)
    )
};

Я сделал это, прочитав файл в байт[] сначала, удалив файл, а затем вернув ответ:

        // Read the file into a byte[] so we can delete it before responding
        byte[] bytes;
        using (var stream = new FileStream(path, FileMode.Open))
        {
            bytes = new byte[stream.Length];
            stream.Read(bytes, 0, (int)stream.Length);
        }
        File.Delete(path);

        HttpResponseMessage result = new HttpResponseMessage(HttpStatusCode.OK);
        result.Content = new ByteArrayContent(bytes);
        result.Content.Headers.ContentType = new MediaTypeHeaderValue("application/octet-stream");
        result.Content.Headers.Add("content-disposition", "attachment; filename=foo.bar");
        return result;