从MVC返回延迟的流

本文关键字:延迟 返回 MVC | 更新日期: 2023-09-27 18:08:41

我有一个MVC动作,目前返回一个PDF:

return File(File.OpenRead(pdfPath), "application/pdf");

这是一个简化。如果文件存在,那么我们直接去OpenRead,但在其他情况下,它需要首先被检索或生成。这部分可能会导致客户端等待HTTP响应的大量延迟。

我想知道MVC是否有一种方法可以立即返回流,但只有在文件可用时才开始写入。

这样,PDF客户端(内置chrome)将从一开始就显示加载旋转器,而不仅仅是在流正在主动传输时。

从MVC返回延迟的流

我不认为这是可能立即返回流,至少不是在MVC模型,但你可以返回报头至少让客户端知道的东西来了。下面是一个例子:

public void SO32070323()
{
    var file = new FileInfo(@"J:'Projects'XibisAutoGenTests'IansAwesomeSite'private'test.pdf");
    Response.AddHeader("Content-Disposition", "inline;filename=somefile.pdf");
    Response.AddHeader("Content-Length", file.Length.ToString());
    Response.Flush();
    Thread.Sleep(5000);
    Response.TransmitFile(file.FullName);
}

这种方式发送内容长度和配置,以便客户端知道文件即将到来。您可以稍后发送实际的文件内容。

请注意,大多数客户端可能有一个超时,所以你不能永远等待之前发送的内容。超时时间可能因客户端而异,但我希望如果您可以在30秒内发送内容,您就可以了。