【问题标题】:How to return a list of FileStreamResult如何返回 FileStreamResult 列表
【发布时间】:2019-12-21 01:29:02
【问题描述】:

我有一个 Web API (ASP.NET Core 2.2) 服务,我需要在其中循环遍历 OID 列表并通过 MemoryStream 返回编码为 FileStreamResult 的解码字节 []。如果我从列表中删除 OID 并且只运行一次,我可以将 FileStreamResult 作为 PDF 文档返回。我需要能够返回相同的 FileStreamResult,每个 OID 都被传递到 MemoryStream 中,但我只返回一个文本结果:

[
    {
        "fileStream": {
            "canRead": true,
            "canSeek": true,
            "canWrite": true,
            "capacity": 300009,
            "length": 300009,
            "position": 0,
            "canTimeout": false 

Controller 上的方法调用如下所示:

public async Task<IActionResult> Index(string searchValue)
{
     var oid = await _oidLookup.LookupOid(searchValue);
     byte[] documentBytes = await _extractDocument.ExtractDocument(oid.FirstOrDefault());

     if (documentBytes != null)
     {
        MemoryStream ms = new MemoryStream(documentBytes);
        return new FileStreamResult(ms, "application/pdf");
      }

      return Ok("No documents found");
}

但是当我把它改成:

if (oidList.Count > 0)
{
    foreach (var oid in oidList)
    {
        byte[] documentBytes = await _extractDocument.ExtractDocument(oid);

        if (documentBytes != null)
        {
            MemoryStream ms = new MemoryStream(documentBytes);
            fileStreamResults.Add(new FileStreamResult(ms, "application/pdf"));
        }

        return fileStreamResults;
    }
}

我得到了上面列出的文本结果。

如果我像这样遍历 OID 列表:

foreach (var oid in oids)
{
    byte[] documentBytes = await _extractDocument.ExtractDocument(oid);

    if (documentBytes != null)
    {
        MemoryStream ms = new MemoryStream(documentBytes);
        return new FileStreamResult(ms, "application/pdf");
    }
}

我只得到第一个文件。

我需要能够遍历 OID 列表并将每个 FileStreamResult 作为多个 PDF 文档返回。

【问题讨论】:

  • 每个控制器方法只能返回 1 个任务。循环应该在调用方法中? Javascript 循环 ajax 调用该方法可能吗?您可能需要打开多个标签才能执行此操作....不太确定。

标签: c# asp.net-core asp.net-core-webapi


【解决方案1】:

首先,任何方法、动作与否都不能有多个返回语句。就目前而言,该方法将简单地在循环的第一次迭代中返回,仅此而已 - 不会发生进一步的枚举。这当然是你只得到第一个项目的原因。

可以做一个yield return,这可能是你在这里想要实现的。例如:

yield return new FileStreamResult(ms, "application/pdf");

这将需要IEnumerable&lt;FileStreamResult&gt; 方法的返回类型。但是,这实际上并不适用,因为您只能返回一个 IActionResult,而不是 IActionResults 的可枚举。

一个请求 = 一个响应。文件是完整的响应。您不能在单个请求中返回多个文件。句号。这根本不是事情的运作方式。如果您需要在单个请求中返回多个文件,您唯一的选择是返回这些文件的存档(即 zip 文件)。这样你仍然只返回一个文件;它恰好是一个包含多个文件的档案。不过,这是您唯一的选择。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-10-22
    • 1970-01-01
    • 2011-09-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多