Прежде всего, я думаю, что вы должны добавить все заголовки, прежде чем начнете писать фактический вывод / контент.С буферизованным потоком (что я и собираюсь предложить) это не должно иметь никакого значения и является в основном только семантическим, но поскольку заголовки должны быть добавлены до записи контента (контент всегда последний)может избежать подобных проблем в будущем, если вы решите использовать небуферизованный поток.
Поэтому я предлагаю вам изменить порядок кода соответствующим образом:
context.Response.ContentType = document.Type
context.Response.AddHeader("Content-Disposition", Baselib.FormatContentDispositionHeader($"{document.Name}"))
context.Response.AddHeader("Last-Modified", DateTime.Now.ToLongDateString())
context.Response.OutputStream.Write(document.Content, 0, document.Size)
Теперь, если вы используете небуферизованный потоксодержимое будет отправлено клиенту сразу же после того, как вы вызовете OutputStream.Write()
, поэтому для того, чтобы впоследствии установить результат HTTP, вам необходимо убедиться, что весь ваш ответ буферизирован, чтобы он не отправлялся до вашего внутреннего запроса (действие иконтроллер) завершил выполнение.Это можно сделать, установив Response.BufferOutput
на True
перед выводом чего-либо:
context.Response.BufferOutput = True
context.Response.ContentType = document.Type
'The rest of the code...
Наконец, вам нужно удалить вызовы на Response.Flush()
и Response.End()
, так как онипреждевременно очистите буфер и напишите все клиенту, прежде чем вы сможете вернуть код состояния.
Новый код:
(...)
context.Response.BufferOutput = True
context.Response.ContentType = document.Type
context.Response.AddHeader("Content-Disposition", Baselib.FormatContentDispositionHeader($"{document.Name}"))
context.Response.AddHeader("Last-Modified", DateTime.Now.ToLongDateString())
Return HttpStatusCode.OK