如何返回FileStreamResult的列表

时间:2019-12-19 21:00:16

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

我有一个Web API(ASP.NET Core 2.2)服务,在这里我需要遍历OID列表并通过MemoryStream返回编码为FileStreamResult的已解码byte []。如果我从列表中删除OID并仅运行一次,则可以将FileStreamResult作为PDF文档返回。我需要能够通过将每个OID传递到MemoryStream中来返回相同的FileStreamResult,但是我只会得到返回的文本结果:

[
    {
        "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 个答案:

答案 0 :(得分:0)

首先,任何方法,动作或没有动作都不能具有多个return语句。就目前而言,该方法将仅在循环的第一次迭代中返回,仅此而已-不再进行任何枚举。当然,这就是为什么您只获得第一项的原因。

可以做yield return,这可能就是您在此尝试实现的。例如:

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

这将要求返回方法IEnumerable<FileStreamResult>的类型。但是,在这里实际上不起作用,因为您只能返回一个IActionResult,而不能返回IActionResult的枚举。

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