HttpResponseMessage内容不会显示PDF

use*_*049 12 pdf asp.net-mvc content-type asp.net-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;
Run Code Online (Sandbox Code Playgroud)

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

不幸的是,我不确定问题出在哪里,但即使我设置了内容类型:

response.Content.Headers.ContentType = new MediaTypeHeaderValue("application/pdf");
Run Code Online (Sandbox Code Playgroud)

当我点击调用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 }
Run Code Online (Sandbox Code Playgroud)

我认为客户端应用程序缺少一些设置,允许它像我的Web Api那样呈现PDF ...

任何帮助,将不胜感激.谢谢

use*_*049 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");
Run Code Online (Sandbox Code Playgroud)

通过这种方式,我的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);
}
Run Code Online (Sandbox Code Playgroud)

在返回File for output之前,返回的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");
Run Code Online (Sandbox Code Playgroud)

我希望这对其他人有用,因为我浪费了很多时间让它工作.

  • 我的 api 控件上有 [Authorize[ 属性。我无法直接从 web api 发送文件。在 ajax 请求完成后,我必须以某种方式在客户端处理字节 []。**data = "data:application/octet-stream;base64," + data; document.location = data;** 这些行确实下载了文件,但文件没有任何名称或扩展名。我只看到“下载”作为文件名。如何在客户端设置文件名? (2认同)