如何删除作为HttpResponseMessage的StreamContent发送的文件

时间:2013-03-08 07:21:03

标签: c# asp.net asp.net-web-api httpresponse dispose

在ASP.NET webapi中,我将一个临时文件发送给客户端。我打开一个流来读取文件并在HttpResponseMessage上使用StreamContent。一旦客户端收到文件,我想删除这个临时文件(没有来自客户端的任何其他调用) 一旦客户端收到文件,就会调用HttpResponseMessage的Dispose方法&流也被处理掉了。现在,我想删除临时文件。

一种方法是从HttpResponseMessage类派生一个类,重写Dispose方法,删除这个文件&调用基类的dispose方法。 (我还没试过,所以不知道这是否有效)

我想知道是否有更好的方法来实现这一目标。

3 个答案:

答案 0 :(得分:15)

实际上your comment帮助解决了这个问题......我在这里写到了这个问题:

Delete temporary file sent through a StreamContent in 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);
    }
}

答案 1 :(得分:7)

从具有DeleteOnClose选项的FileStream创建StreamContent。

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

答案 2 :(得分:4)

我首先将文件读入byte [],删除文件,然后返回响应:

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