C# 如何删除作为HttpResponseMessage的StreamContent发送的文件
在ASP.NET webapi中,我向客户端发送一个临时文件。我打开一个流来读取文件,并使用HttpResponseMessage上的StreamContent。一旦客户端收到文件,我想删除这个临时文件(不需要客户端的任何其他调用) 一旦客户端接收到该文件,就会调用HttpResponseMessage的Dispose方法&流也会被释放。现在,我想删除临时文件,在这一点上 一种方法是从HttpResponseMessage类派生一个类,重写Dispose方法,删除此文件并调用基类的Dispose方法。(我还没有试过,所以不知道这是否确实有效) 我想知道是否有更好的方法来实现这一点 实际上帮助解决了这个问题。。。我在这里写到: 这是对我有用的东西。请注意,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
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()调用
和来自终结器。终结器决不能抛出。因此,您可能希望测试处理
,并且只调用文件。如果处理
为真,则删除
。希望您的文件不要太大。这非常有效,正是我想要的。谢谢。