Подтвердить что ты не робот

ActionResult возвращает поток

My ActionResult возвращает File, но мне также нужно его условно вернуть Stream.

Мне не удалось найти документацию о том, как ActionResult может вернуть Stream.

Вот мой код для возврата файла:

    return File(memoryStream,.... )

Как уже упоминалось, мне нужно вернуть только Stream.

4b9b3361

Ответ 1

Используйте FileStreamResult:

MemoryStream stream = someService.GetStream();

return new FileStreamResult(stream, "application/pdf")

Ответ 2

При вызове действия другое действие представляет собой запах дизайна. Вы должны избегать этого. Просто поставьте логику, которую нужно повторно использовать между двумя действиями в сервисном слое. А затем вызовите эту логику из двух действий.

Например:

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

Теперь вам больше не нужно вызывать второе действие из первого.

Ответ 3

Самый короткий способ использования 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");