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

C# 如何删除作为HttpResponseMessage的StreamContent发送的文件,c#,asp.net,asp.net-web-api,httpresponse,dispose,C#,Asp.net,Asp.net Web Api,Httpresponse,Dispose,在ASP.NET webapi中,我向客户端发送一个临时文件。我打开一个流来读取文件,并使用HttpResponseMessage上的StreamContent。一旦客户端收到文件,我想删除这个临时文件(不需要客户端的任何其他调用) 一旦客户端接收到该文件,就会调用HttpResponseMessage的Dispose方法&流也会被释放。现在,我想删除临时文件,在这一点上 一种方法是从HttpResponseMessage类派生一个类,重写Dispose方法,删除此文件并调用基类的Dispose

在ASP.NET webapi中,我向客户端发送一个临时文件。我打开一个流来读取文件,并使用HttpResponseMessage上的StreamContent。一旦客户端收到文件,我想删除这个临时文件(不需要客户端的任何其他调用) 一旦客户端接收到该文件,就会调用HttpResponseMessage的Dispose方法&流也会被释放。现在,我想删除临时文件,在这一点上

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

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

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

这是对我有用的东西。请注意,
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);
    }
}

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

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

从具有DeleteOnClose选项的文件流创建StreamContent

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

上述方法似乎有效,但在删除文件之前需要先处理内容(因为文件流仍然打开)
protected override void Dispose(bool disposing){Content.Dispose();FileInfo file=new FileInfo(_localFile);file.Delete();base.Dispose(disposing);}
只是补充一句,同样的问题在回答这个问题一个月后被问到了,它与这个问题类似。但是它不是子类化
HttpResponseMessage
,而是用
StreamContent
。我觉得这样做更舒服,因为它更接近问题所在(覆盖较少的行为),避免显式调用
Content.Dispose();
使用此类方法时要非常小心。
Dispose(bool)
方法意味着从两个
Dispose()调用
和来自终结器。终结器决不能抛出。因此,您可能希望测试
处理
,并且只调用
文件。如果
处理
为真,则删除
。希望您的文件不要太大。这非常有效,正是我想要的。谢谢。