处理多个请求并仅返回一个

Handling multiple Requests and return just one

提问人:Tommy 提问时间:9/19/2023 更新时间:9/19/2023 访问量:39

问:

我从前端应用程序收到多个 POST 请求。例如,一个块可以存储 5 个文件,如果前端应用程序向我发送 10 个文件,则意味着它发送 2 个文件块 == 2 个请求。我想抓住这 2 个请求并从中创建一个 PDF 文件。现在我的代码正在制作 2 个单独的 PDF 而不是 1 个 PDF。

控制器.cs

[HttpPost]
    [Route("exportToPdf")]
    public async Task<IActionResult> GeneratePdf([FromQuery] string colorMode, [FromQuery] string? textOrPath)
    {
        try
        {
            var tasks = new List<Task<byte[]>>();

            foreach (var svgFile in Request.Form.Files)
            {
                var task = Task.Run(() =>
                {
                    return _pdfGeneratorService.GeneratePdfFromSvgFile(svgFile, colorMode, textOrPath);
                });
                tasks.Add(task);
            }

            await Task.WhenAll(tasks);

            var pdfPages = tasks.Select(task => task.Result).ToList();

            var finalPdfBytes = MergePages.MergePdfPages(pdfPages);

            var memoryStream = new MemoryStream(finalPdfBytes);

            return File(memoryStream, "application/pdf", "output.pdf");

        }
        catch (NoFileProviderException ex)
        {
            _logger.LogError(ex.Message);
            return BadRequest(ex.Message);
        }
        catch (Exception ex)
        {
            _logger.LogError(ex, "An error occurred while generating the PDF");
            return StatusCode(StatusCodes.Status500InternalServerError, ex.Message);
        }
    }
C# .NET 异步 请求

评论

1赞 jdweng 9/19/2023
服务器如何知道将接收的文件数量?服务器是否需要一次合并所有文件,或者服务器可以一次将每个文件附加到 pdf 中吗?在开始编写解决方案代码之前,首先必须了解要求。
0赞 Tommy 9/19/2023
@jdweng服务器不知道他会得到多少文件。现在我的代码抓取所有块,对于每个块,它将生成单独的 PDF,但我想为所有块生成一个 PDF。
1赞 user16606026 9/19/2023
请求者需要告诉您的服务器它是否已经完成或还有更多。
0赞 Tommy 9/19/2023
我的队友(请求者)创建了一个区块的标头,最后一个区块的 Header: “Chunk-End”。也许我应该用这个?@XiangWeiHuang
1赞 user16606026 9/19/2023
这样做的一个正确想法是请求者首先从服务器获取一个唯一的 ID,然后您继续与该 ID 进行通信,这样您就可以区分您附加的是哪个 pdf。否则,如果有多个请求正在进行,事情会变得一团糟。

答: 暂无答案