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

Bha*_*uru 17 c# asp.net dispose httpresponse asp.net-web-api

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

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

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

Len*_*rri 15

实际上你的评论有助于解决这个问题......我在这里写到:

删除通过ASP.NET Web API HttpResponseMessage中的StreamContent发送的临时文件

这对我有用.请注意,内部调用的顺序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);
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 只是补充一下,在这个答案后一个月就问了同样的问题,[这里](http://stackoverflow.com/questions/20137283/web-api-how-to-detect-when-a-response-has-完成发送),它与此类似.但它没有子类化`HttpResponseMessage`,而是使用`StreamContent`.以这种方式完成工作让我感觉更舒服,因为它更接近问题(覆盖较少的行为),避免显式调用`Content.Dispose();` (2认同)

Ser*_*eyS 10

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

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