如何在.NET中保存来自外部GET请求的流数据

问题描述 投票:0回答:1

我当前在 .NET (c#) 后端中,对外部 URL 进行 GET 调用,该调用返回

responseType: 'stream'
。 在这种情况下,它正在流回数据,一旦完成,该数据应该是有效的 .PDF 文件。 从 Postman 调用此外部 API 工作正常并显示 pdf,但我的代码似乎没有获取所有流数据,导致文件无效。

这是我的功能:

private async Task<string?> ReadFileData(string url)
{
    string fileData = null;

        using (var response = await _httpClient.GetAsync(url))
        {
            response.EnsureSuccessStatusCode();
            var stream = await response.Content.ReadAsStreamAsync();
            fileData += await response.Content.ReadAsStringAsync();
        }

        return fileData;
    }

只是我尝试过的事情之一,但我似乎没有流式传输整个数据集,尽管我得到了应该是数百行(原始文本)pdf 文件的前 15 行左右,我做了很多研究,但似乎没有发现任何东西。 我确信我错过了一些关于数据流的愚蠢的东西,如果有人有任何煽动那就太好了

c# .net asp.net-web-api
1个回答
0
投票

只是我尝试过的事情之一,但我似乎没有流媒体 整个数据集,尽管我得到了前 15 行左右 应该是一个数百行(原始文本)的pdf文件,我做了 进行了相当多的研究,但似乎没有发现任何东西。

根据您的场景和描述以及共享的代码片段,我已尝试解决您的问题。

根据我的测试,您代码中的问题在于您处理响应内容的方式。您正在尝试将内容作为字符串读取,这不适合 PDF 文件等二进制数据。相反,您需要正确处理流。

为了解决这个问题,请使用 ReadAsStreamAsync 将流数据读取到

MemoryStream
中,然后将其转换为
byte array
,然后您可以根据需要对其进行处理或保存。以下是您如何调用
ReadFileDataAsync
方法并将数据保存到文件(如果需要):

[Route("api/[controller]")]
[ApiController]
public class FileAccessController : ControllerBase
{
    private readonly HttpClient _httpClient;

    public FileAccessController(IHttpClientFactory httpClientFactory)
    {
        _httpClient = httpClientFactory.CreateClient();
    }

    [HttpGet("download-file")]
    public async Task<IActionResult> DownloadFile(string url)
    {
        try
        {
            //Passing the url to the file content reading method
            byte[] fileData = await ReadFileDataAsync(url);

            // I am Returning the file as a FileResult
            return File(fileData, "application/pdf", "downloaded-file.pdf");
        }
        catch (Exception ex)
        {
            return StatusCode(500, $"An error occurred: {ex.Message}");
        }
    }

    private async Task<byte[]> ReadFileDataAsync(string url)
    {
        using (var response = await _httpClient.GetAsync(url, HttpCompletionOption.ResponseHeadersRead))
        {
            response.EnsureSuccessStatusCode();

            using (var stream = await response.Content.ReadAsStreamAsync())
            using (var memoryStream = new MemoryStream())
            {
                await stream.CopyToAsync(memoryStream);
                return memoryStream.ToArray();
            }
        }
    }
}

输出:

enter image description here

enter image description here

enter image description here

enter image description here

enter image description here

注意: 按照上述方式,fileData 中就有了完整的 PDF 数据,您可以根据需要使用。如果不需要将其保存到文件中,则可以直接在应用程序中使用 fileData 字节数组。如果您需要任何其他帮助,请参阅此官方文档

© www.soinside.com 2019 - 2024. All rights reserved.