Прежде всего, я люблю ASP.NET MVC. Этот вопрос не критика этого. Скорее, я хочу подтвердить то, что я вижу, и убедиться, что я что-то не пропустил. Терпите меня ... Я не могу добраться до вопроса, не предоставив немного контекста.
Вопрос связан с возвратом данных в потоке в ответ на сообщение HTTP. В старые времена до ASP.NET MVC вы могли сделать это, отправив свои данные напрямую в поток ответов. Например, вы можете сделать что-то вроде этого:
someObjectThatDumpsOutputToWhateverStreamYouHandIt.WriteTo(Response.OutputStream);
Обратите внимание на ключевой аспект этого кода: я не реализовал ЛЮБОГО резервного хранилища. Мне не нужно было передавать информацию в байтовый массив или записывать ее во временный файл. Скорее, ASP.NET уже настроил поток для передачи ответа обратно в браузер, и я выгружал нужный вывод прямо в этот поток. Это более эффективно с точки зрения использования процессора, памяти и времени выполнения, чем копирование всех данных во временное местоположение и последующее перемещение их в поток ответов.
Однако он не очень подходит для юнит-тестов. Фактически, вы все еще можете делать такой код в ASP.NET MVC, но обычай будет избегать этого. Скорее ASP.NET MVC будет рекомендовать вам вернуть ActionResult. ActionResult - это концепция ASP.NET MVC, которая в основном предназначена для модульного тестирования. Это позволяет вам «объявить», что вы хотите сделать. Модульный тест может выполнить действие контроллера и подтвердить, что он получает ожидаемый ActionResult. Этот модульный тест может выполняться вне браузера.
ASP.NET MVC предлагает своего рода ActionResult для возврата потоков данных. Это называется FileStreamResult. Не позволяйте слову «Файл» в имени обмануть вас. Речь идет о возврате потока данных, в точности как мы говорим выше.
Однако вот проблема и основа моего вопроса: Если вы заставите свой метод Controller возвращать FileStreamResult, и вы передадите ему поток, который вы хотите вернуть, то, по-видимому, его больше нет чтобы вы выгружали данные непосредственно в поток ответа. Теперь, похоже, вы вынуждены создать свой собственный поток с резервным хранилищем (например, памятью или файлом), сбросить в него свои данные и затем передать Поток к FileStreamResult, который вы возвращаете.
Так что, похоже, я должен сделать что-то вроде этого (намеренно опуская dispose / using / etc.):
MemoryStream myIntermediateStream = new MemoryStream();
someObjectThatDumpsOutputToWhateverStreamYouHandIt.WriteTo(myIntermediateStream );
return new FileStreamResult(myIntermediateStream, "application/pdf");
Обратите внимание, что myIntermediateStream заставляет содержимое большого потока данных временно сохраняться в памяти, чтобы впоследствии FileStreamResult мог снова скопировать его в выходной поток Response.
Итак, вот мой вопрос: я что-то упустил или правильно сказать, что использование FileStreamResult вынуждает вас иметь промежуточное хранилище, которое вы не будете иметь, если будете писать прямо в ответ? выходной поток?
Спасибо.