ActionResult返回一个Stream

Nat*_*Pet 18 c# asp.net-mvc

ActionResult回来了,File但我也需要它有条件地返回一个Stream.

我无法找到关于如何ActionResult返回的文档Stream.

这是我返回文件的代码:

    return File(memoryStream,.... )
Run Code Online (Sandbox Code Playgroud)

如上所述,我需要返回一个Stream.

aif*_*rfa 33

用途FileStreamResult:

MemoryStream stream = someService.GetStream();

return new FileStreamResult(stream, "application/pdf")
Run Code Online (Sandbox Code Playgroud)

  • -1; 这有点困惑,虽然我不得不深入研究文档以实现它.OP的现有代码 - 使用流作为第一个参数调用[`Controller.File`](https://msdn.microsoft.com/en-us/library/system.web.mvc.controller.file(v = vs .118).aspx#Anchor_6) - *已经*在引擎盖下生成`FileStreamResult`.你只是提出了一个更详细的语法来解释OP的代码已经做了什么! (4认同)
  • 谢谢.同样好奇的是,是否可以只返回一个流而不与say pdf相关联.意思是,只返回一个流 (3认同)

Dar*_*rov 7

有一个动作叫另一个动作是一种设计气味.你应该避免它.简单地说,需要在服务层中的2个动作之间重用逻辑.然后从你的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's return the stream to the client so that he could download it as file
    return File(stream, "application/pdf");
}
Run Code Online (Sandbox Code Playgroud)

现在,您不再需要从第一个操作中调用第二个操作.


Mar*_*ery 5

在问题中已经使用的最简单的方法来使用a Stream作为Action Method的结果Controller:使用的File辅助方法Controller。这将返回FileStreamResult

有几个重载可用Stream。这两个重载都需要指定响应的MIME类型,该类型将作为Content-Type响应的标头发出。如果您的情况对您的应用程序是未知的,则始终可以分别指定text/plainapplication/octet-stream针对任意文本或二进制数据。一个重载另外需要第三个参数,该参数设置文件名以显示在浏览器的下载对话框中(通过Content-Disposition标题控制)(如果适用)。

重载签名

protected internal FileStreamResult File(
    Stream fileStream,
    string contentType
)
Run Code Online (Sandbox Code Playgroud)

protected internal virtual FileStreamResult File(
    Stream fileStream,
    string contentType,
    string fileDownloadName
)
Run Code Online (Sandbox Code Playgroud)

用法示例

return File(myStream, "application/pdf");
Run Code Online (Sandbox Code Playgroud)

要么

return File(myStream, "application/pdf", "billing-summary.pdf");
Run Code Online (Sandbox Code Playgroud)