19

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

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

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

4

3 回答 3

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);
    }
}
于 2013-10-29T15:45:55.180 回答
15

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

return new HttpResponseMessage(HttpStatusCode.OK)
{
    Content = new StreamContent(
        new FileStream("myFile.txt", FileMode.Open, 
              FileAccess.Read, FileShare.None, 4096, FileOptions.DeleteOnClose)
    )
};
于 2016-09-21T07:03:30.193 回答
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;
于 2015-02-03T20:04:54.833 回答