在ASP.NET webapi中,我将一个临时文件发送给客户端。我打开一个流来读取文件并在HttpResponseMessage上使用StreamContent。一旦客户端收到文件,我想删除这个临时文件(没有来自客户端的任何其他调用) 一旦客户端收到文件,就会调用HttpResponseMessage的Dispose方法&流也被处理掉了。现在,我想删除临时文件。
一种方法是从HttpResponseMessage类派生一个类,重写Dispose方法,删除这个文件&调用基类的dispose方法。 (我还没试过,所以不知道这是否有效)
我想知道是否有更好的方法来实现这一目标。
答案 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;