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

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

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

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

Ответ 1

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

Удалить временный файл, отправленный через StreamContent в веб-API ASP.NET 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);
    }
}

Ответ 2

Создайте свой StreamContent из FileStream с параметром DeleteOnClose.

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

Ответ 3

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

        // 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;