Asp.net Web Api-如何检测响应何时完成发送
在WebAPI方法中,我生成一个文件,然后像这样将其流式传输到响应Asp.net Web Api-如何检测响应何时完成发送,asp.net,asp.net-web-api,Asp.net,Asp.net Web Api,在WebAPI方法中,我生成一个文件,然后像这样将其流式传输到响应 public async Task<HttpResponseMessage> GetFile() { FileInfo file = generateFile(); var msg = Request.CreateResponse(HttpStatusCode.OK); msg.Content = new StreamContent(file.OpenRead()); msg.Con
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;
}
public异步任务GetFile(){
FileInfo file=generateFile();
var msg=Request.CreateResponse(HttpStatusCode.OK);
msg.Content=newstreamcontent(file.OpenRead());
msg.Content.Headers.ContentType=新的MediaTypeHeaderValue(“应用程序/pdf”);
msg.Content.Headers.ContentDisposition=新的ContentDispositionHeaderValue(“附件”){FileName=file.Name};
返回味精;
}
因为这是一个生成的文件,所以我想在响应完成流式传输后删除它,但我似乎在管道中找不到用于此的挂钩
我假设我可以将对该文件的引用放在一个静态变量中,并设置一个自定义MessageHandler,从同一个静态变量中提取值并删除。然而,这似乎不可能是正确的,因为使用了静态路由(当所有这些都应该是每个请求时),并且因为我必须注册一个单独的路由
我已经看到了,但它似乎没有太多有用的响应。很好的场景!。。。使用消息处理程序的问题是,响应写入发生在主机层和消息处理程序层之下,因此它们并不理想 以下是一个示例,说明了如何做到这一点:
msg.Content = new CustomStreamContent(generatedFilePath);
顺便问一下,您生成此文件是因为您正在将一些数据转换为PDF。如果是,那么我认为您可以使用
PushStreamContent
直接将转换后的数据写入响应流。这样,您不必先生成一个文件,然后再担心以后删除它。我们在WebAPI中执行了相同的操作。我需要删除刚下载完FormServer的文件。
我们可以创建自定义响应消息类。它以文件路径为参数,并在传输后将其删除
public class FileResponseMessage : HttpResponseMessage
{
private readonly string _filePath;
public FileHttpResponseMessage(string filePath)
{
this._filePath= filePath;
}
protected override void Dispose(bool disposing)
{
base.Dispose(disposing);
Content.Dispose();
File.Delete(_filePath);
}
}
按照下面的代码使用这个类,一旦文件写入响应流,它就会删除您的文件
var response = new FileResponseMessage(filePath);
response.StatusCode = HttpStatusCode.OK;
response.Content = new StreamContent(new FileStream(filePath, FileMode.Open, FileAccess.Read));
response.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment")
{
FileName = "MyReport.pdf"
};
return response;
谢谢Kiran,我试着用装饰图案来做这样的事情,并且把我的头发拔出来,因为我不能凌驾于公众之上。在这一点上(由于您使用的是Web Api),将来我们是否有可能让HttpContent基于接口?是的,我正在生成一个pdf,但通过向phantomjs输出文件来实现,因此文件是我的基本交换格式,不幸的是,
流
只有在disposing=true时才应该在Dispose方法中执行代码。否则你会有问题。
var response = new FileResponseMessage(filePath);
response.StatusCode = HttpStatusCode.OK;
response.Content = new StreamContent(new FileStream(filePath, FileMode.Open, FileAccess.Read));
response.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment")
{
FileName = "MyReport.pdf"
};
return response;