我正在创建一个代理服务器,该服务器向 PDF Blob 链接发出请求,然后接受该请求来设置我们发送到客户端的 HttpResponse header 。该图应该解释一下
到目前为止,我已成功发出获取 pdf 内容的请求,但我不确定如何将其发送回用户。我关注了其他 Stackoverflow 帖子,例如:https://stackoverflow.com/a/43232581/10541061
我将图中步骤 3 中的响应消息转换为流,并在新的 HttpResponseMessage 内容中将其发送回。但我得到的不是 PDF 内容,而是一个 json 文件
我想返回给客户的内容
我实际返回给客户的内容
这是我用来创建此代理端点的代码
[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
[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/