2015-08-18 2 views
5

У меня есть действие MVC, который в настоящее время возвращает PDF:Возврат задерживается поток из MVC

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

Это упрощение. Если файл существует, мы переходим прямо к OpenRead, но в других случаях его нужно сначала получить или сгенерировать. Именно эта часть может вызвать существенную задержку для клиента, ожидающего ответа HTTP.

Мне интересно, есть ли способ с MVC немедленно вернуть поток, но только начать писать ему, как только файл будет доступен.

Таким образом, клиент PDF (встроенные хромы) покажет загрузчик с начала, а не только в то время, когда поток активно переносится.

ответ

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); 

} 

Таким образом вы отправляете длину и расположение контента, чтобы клиент знал, что файл подходит. Затем вы можете отправить фактическое содержимое файла позже.

Обратите внимание, что большинство клиентов, вероятно, имеют тайм-аут, поэтому вы не можете ждать всегда, прежде чем отправлять контент. Тайм-аут, вероятно, будет отличаться для каждого клиента, но я ожидаю, что если вы сможете отправить контент в течение 30 секунд, все будет в порядке.

Смежные вопросы