在 Web api 方法中,我生成一个文件,然后将其流式传输到响应,如下所示
public async Task<HttpResponseMessage> GetFile() {
FileInfo file = generateFile();
var msg = Request.CreateResponse(HttpStatusCode.OK);
msg.Content = new StreamContent(file.OpenRead());
msg.Content.Headers.ContentType = new MediaTypeHeaderValue("application/pdf");
msg.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment") {FileName = file.Name};
return msg;
}
因为这是一个生成的文件,我想在响应完成流式传输后将其删除,但我似乎无法在管道中找到此钩子。
我想我可以将文件的引用放在静态中,并设置一个自定义 MessageHandler,从同一个静态变量中提取值并删除。然而,这似乎不可能是正确的,因为使用了静态(当这一切都应该是每个请求时)并且因为我必须注册一个单独的路由。
我见过这个问题 https://stackoverflow.com/questions/16359485/how-to-know-when-a-response-has-finished-being-sent-to-the-client但似乎并没有真正有太多有用的回应。
不错的场景!...使用消息处理程序的问题是响应写入发生在主机层和消息处理程序层下方,因此它们并不理想...
以下是如何执行此操作的示例:
msg.Content = new CustomStreamContent(generatedFilePath);
public class CustomStreamContent : StreamContent
{
string filePath;
public CustomStreamContent(string filePath)
: this(File.OpenRead(filePath))
{
this.filePath = filePath;
}
private CustomStreamContent(Stream fileStream)
: base(content: fileStream)
{
}
protected override void Dispose(bool disposing)
{
//close the file stream
base.Dispose(disposing);
try
{
File.Delete(this.filePath);
}
catch (Exception ex)
{
//log this exception somewhere so that you know something bad happened
}
}
}
顺便说一句,您生成此文件是因为您要将一些数据转换为 PDF。如果是,那么我想你可以使用PushStreamContent
为此,通过将转换后的数据直接写入响应流。这样您就不必先生成文件,然后再担心删除它。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)