Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/36.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net Web Api-如何检测响应何时完成发送_Asp.net_Asp.net Web Api - Fatal编程技术网

Asp.net Web Api-如何检测响应何时完成发送

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

在WebAPI方法中,我生成一个文件,然后像这样将其流式传输到响应

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;