HttpResponseMessage内容将不显示PDF

问题描述 投票:12回答:2

我创建了一个Web Api,该Web Api返回HttpResponseMessage,其中的内容设置为PDF文件。如果我直接致电Web Api,它将很好用,并且PDF在浏览器中呈现。

response.Content = new StreamContent(new FileStream(pdfLocation, FileMode.Open, FileAccess.Read));
        response.Content.Headers.ContentType = new MediaTypeHeaderValue("application/pdf");
        response.Headers.ConnectionClose = true;
        return response;

我有一个MVC客户端想联系Web Api,请求Pdf文件,然后以与上述相同的方式将其呈现给用户。

不幸的是,即使我设置了内容类型,我也不知道问题出在哪里:

response.Content.Headers.ContentType = new MediaTypeHeaderValue("application/pdf");

当我单击调用Web API的链接时,我得到HttpResponseMessage的文本呈现。

StatusCode: 200, ReasonPhrase: 'OK', Version: 1.1, Content: System.Net.Http.StreamContent, Headers: { Connection: close Content-Disposition: attachment Content-Type: application/pdf }

我认为客户端应用程序缺少某些设置,使其可以像Web Api一样呈现PDF ...

任何帮助将不胜感激。谢谢

asp.net-mvc pdf asp.net-web-api content-type
2个回答
22
投票

经过数小时的Google搜索以及反复试验,我已经在这里解决了该问题。

不是将响应的内容设置为StreamContent,而是在Web Api端将其更改为ByteArrayContent。

byte[] fileBytes = System.IO.File.ReadAllBytes(pdfLocation);
response.Content = new ByteArrayContent(fileBytes);
response.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment");
response.Content.Headers.ContentDisposition.FileName = fileName;
response.Content.Headers.ContentType = new MediaTypeHeaderValue("application/pdf");

通过这种方式,我的MVC 4应用程序能够使用WebClient和DownloadData方法下载PDF。

internal byte[] DownloadFile(string requestUrl)
{
    string serverUrl = _baseAddress + requestUrl;
    var client = new System.Net.WebClient();
    client.Headers.Add("Content-Type", "application/pdf");
    return client.DownloadData(serverUrl);
}

返回的Byte []数组可以很容易地转换为MemoryStream,然后再返回文件进行输出...

Response.AddHeader("Content-Disposition", "inline; filename="+fileName);
MemoryStream outputStream = new MemoryStream();
outputStream.Write(file, 0, file.Length);
outputStream.Position = 0;
return File(outputStream, "application/pdf");

我希望这对其他人有用,因为我已经浪费了很多时间来使其工作。


0
投票

只需返回PhysicalFileResult并使用HttpGet方法,URL将打开pdf文件

public ActionResult GetPublicLink()



{
            path = @"D:\Read\x.pdf";
            return new PhysicalFileResult(path, "application/pdf");
}
© www.soinside.com 2019 - 2024. All rights reserved.