Ответ 1
Используйте FileStreamResult
:
MemoryStream stream = someService.GetStream();
return new FileStreamResult(stream, "application/pdf")
My ActionResult
возвращает File
, но мне также нужно его условно вернуть Stream
.
Мне не удалось найти документацию о том, как ActionResult
может вернуть Stream
.
Вот мой код для возврата файла:
return File(memoryStream,.... )
Как уже упоминалось, мне нужно вернуть только Stream
.
Используйте FileStreamResult
:
MemoryStream stream = someService.GetStream();
return new FileStreamResult(stream, "application/pdf")
При вызове действия другое действие представляет собой запах дизайна. Вы должны избегать этого. Просто поставьте логику, которую нужно повторно использовать между двумя действиями в сервисном слое. А затем вызовите эту логику из двух действий.
Например:
public ActionResult Action1()
{
Stream stream = service.GetStream();
// ... do something with the stream and return a view for example
return View();
}
public ActionResult Action2()
{
Stream stream = service.GetStream();
// let return the stream to the client so that he could download it as file
return File(stream, "application/pdf");
}
Теперь вам больше не нужно вызывать второе действие из первого.
Самый короткий способ использования Stream
в результате действия метода действий в Controller
- это тот, который вы уже указали в вопросе: используйте File
вспомогательный метод Controller
. Это возвращает FileStreamResult
.
Есть пара перегрузок, которые принимают Stream
. Для обеих перегрузок требуется указать тип MIME ответа, который будет испускаться как заголовок Content-Type
ответа; если ваши обстоятельства таковы, что это неизвестно вашему приложению, вы всегда можете указать text/plain
или application/octet-stream
для произвольных текстовых или двоичных данных, соответственно. Одна перегрузка дополнительно принимает третий параметр, который устанавливает имя файла для отображения в диалоге загрузки браузера (контролируется через Content-Disposition
), если применимо.
Сигналы перегрузки:
protected internal FileStreamResult File(
Stream fileStream,
string contentType
)
и
protected internal virtual FileStreamResult File(
Stream fileStream,
string contentType,
string fileDownloadName
)
Использование примера:
return File(myStream, "application/pdf");
или
return File(myStream, "application/pdf", "billing-summary.pdf");