c# - 如何从另一个HttpResponseMessage返回PDF内容到浏览器?

标签 c# azure pdf dotnet-httpclient http-proxy

我正在创建一个代理服务器,该服务器向 PDF Blob 链接发出请求,然后接受该请求来设置我们发送到客户端的 HttpResponse header 。该图应该解释一下

enter image description here

到目前为止,我已成功发出获取 pdf 内容的请求,但我不确定如何将其发送回用户。我关注了其他 Stackoverflow 帖子,例如:https://stackoverflow.com/a/43232581/10541061

我将图中步骤 3 中的响应消息转换为流,并在新的 HttpResponseMessage 内容中将其发送回。但我得到的不是 PDF 内容,而是一个 json 文件

我想返回给客户的内容

enter image description here

我实际返回给客户的内容

enter image description here

这是我用来创建此代理端点的代码

        [AllowAnonymous]
        [HttpGet("openPDF")]
        public async Task<HttpResponseMessage> OpenPDF([FromQuery] string url)
        {
            var _httpClient = _httpClientFactory.CreateClient();
            var response = await _httpClient.GetAsync(url);
            var stream = await response.Content.ReadAsStreamAsync();

            HttpResponseMessage message = new HttpResponseMessage(HttpStatusCode.OK);
            message.Content = new StreamContent(stream);
            message.Content.Headers.ContentLength = stream.Length;
            message.Content.Headers.ContentType = new MediaTypeHeaderValue("application/pdf");

            return message;
        }

编辑

好吧,当我像这样编写代理时,这实际上会发回 PDF

        [AllowAnonymous]
        [HttpGet("openPDF")]
        public async Task<FileStreamResult> OpenPDF([FromQuery] string url)
        {
            var fileStream = new MemoryStream();

            var _httpClient = _httpClientFactory.CreateClient();

            var file = await _httpClient.GetStreamAsync(url).ConfigureAwait(false);
            await file.CopyToAsync(fileStream);

            fileStream.Position = 0;
            
            return File(fileStream, "application/pdf", "filename.pdf");
        }

问题是我想将content-disposition更新为inline,这样我就可以强制它在浏览器中打开而不是下载。所以我决定采取filestream 并将其注入(inject)到 httpResponseMessage.content 中,但这仍然不起作用。它会继续向我发送 json 文件

        [AllowAnonymous]
        [HttpGet("openPDF")]
        public async Task<HttpResponseMessage> OpenPDF([FromQuery] string url)
        {
            var fileStream = new MemoryStream();

            var _httpClient = _httpClientFactory.CreateClient();

            var file = await _httpClient.GetStreamAsync(url).ConfigureAwait(false);
            await file.CopyToAsync(fileStream);

            fileStream.Position = 0;
            

            HttpResponseMessage message = new HttpResponseMessage(HttpStatusCode.OK);
            message.Content = new StreamContent(fileStream);
            message.Content.Headers.ContentType = new MediaTypeHeaderValue("application/pdf");

            return message;
        }

说实话,我认为定义内容类型应该足够了,但我猜不行

最佳答案

这对于 .NET 6 来说非常简单...怀疑它对于 .NET 4x 应该大致相同...这使用 NuGet 包 Azure.Storage.Blobs

https://github.com/Azure/azure-sdk-for-net/blob/Azure.Storage.Blobs_12.13.1/sdk/storage/Azure.Storage.Blobs/README.md

[HttpGet("stream")]
public async Task GetBlobAsync()
{
    var url = new Uri("https://path.to.blob.content/xxx");
    var blobClient = new BlobClient(url);
    Response.Headers.Add("Content-Type", "application/pdf");
    Response.Headers.Add("Content-Disposition", @"attachment;filename=""intended file name.pdf""");
    await blobClient.DownloadToAsync(Response.Body);

}

关于c# - 如何从另一个HttpResponseMessage返回PDF内容到浏览器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73541269/

相关文章:

python - pisa html 到 pdf 问题,希腊重音字母与 django 一起使用

windows - 赢bat文件: How to get the result of FIND into a new variable?

C# 隐式转换

c# - Rfc2898DeriveBytes + PBKDF2 + SecureString 是否可以使用安全字符串而不是字符串?

ios - 在ios应用程序swift中使用Azure表存储(NoSQL)

azure - 无法部署到azure web应用服务

c# - 如何使用 Azure Blob 存储下载 Block Blob (Base64) 文件并将其转换为 PNG?

c# - 限制正则​​表达式的长度

python - Azure KeyVault : how to retrieve clientId, clientSecret 和现有服务主体的tenantId?

objective-c - iOS 核心图形 : Using CGContext setters to render a sharp pdf