Содержимое HttpResponseMessage не будет отображаться в формате PDF
Я создал веб-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, который хотел бы связаться с веб-Api, запросить файл Pdf, а затем отобразить его пользователю так же, как указано выше.
К сожалению, я не уверен, где проблема, но даже если я установил тип содержимого:
response.Content.Headers.ContentType = new MediaTypeHeaderValue("application/pdf");
Когда я нажимаю ссылку, которая вызывает веб-api, я получаю текстовое отображение HttpResponseMessage.
StatusCode: 200, ReasonPhrase: 'OK', Version: 1.1, Content: System.Net.Http.StreamContent, Headers: { Connection: close Content-Disposition: attachment Content-Type: application/pdf }
Я думаю, что в клиентском приложении отсутствует какой-либо параметр, который позволит ему отображать PDF, как это делает мой веб-Api...
Любая помощь будет оценена по достоинству.
Благодаря
Ответы
Ответ 1
После нескольких часов поиска Google, а также проб и ошибок, я решил проблему здесь.
вместо того, чтобы устанавливать содержимое ответа на StreamContent, я изменил его на ByteArrayContent на стороне Web Api.
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 может загрузить PDF файл с помощью WebClient и метода DownloadData.
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");
Я надеюсь, что это может быть полезно для других, поскольку я потратил много времени, чтобы заставить его работать.
Ответ 2
Просто верните PhysicalFileResult и используйте метод HttpGet, URL откроет PDF файл
public ActionResult GetPublicLink()
{
path = @"D:\Read\x.pdf";
return new PhysicalFileResult(path, "application/pdf");
}