从MVC返回延迟的流

Dan*_*ell 5 c# asp.net-mvc streaming

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

return File(File.OpenRead(pdfPath), "application/pdf");
Run Code Online (Sandbox Code Playgroud)

这是一种简化.如果文件存在,那么我们直接进入OpenRead,但在其他情况下,需要首先检索或生成.这部分可能导致客户端等待HTTP响应的实质性延迟.

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

这样,PDF客户端(内置的chromes)将从一开始就显示加载微调器,而不仅仅是在流正在传输时.

Ian*_*son 2

我认为不可能立即返回流,至少在 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);

}
Run Code Online (Sandbox Code Playgroud)

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

请注意,大多数客户端可能会出现超时,因此您不能永远等待才能发送内容。每个客户端的超时时间可能有所不同,但我希望如果您可以在 30 秒内发送内容,那就没问题。