我有一个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文档。
答案 0 :(得分:0)
首先,任何方法,动作或没有动作都不能具有多个return语句。就目前而言,该方法将仅在循环的第一次迭代中返回,仅此而已-不再进行任何枚举。当然,这就是为什么您只获得第一项的原因。
可以做yield return
,这可能就是您在此尝试实现的。例如:
yield return new FileStreamResult(ms, "application/pdf");
这将要求返回方法IEnumerable<FileStreamResult>
的类型。但是,在这里实际上不起作用,因为您只能返回一个IActionResult
,而不能返回IActionResult
的枚举。
一个请求=一个响应。文件是完整的响应。您不能在单个请求中返回多个文件。句号。根本不是事情如何运作。如果您需要在单个请求中返回多个文件,则唯一的选择是返回这些文件的归档文件(即zip文件)。这样,您仍然只返回一个文件。它只是一个包含多个文件的存档。不过,那是您唯一的选择。