Подтвердить что ты не робот

Содержимое 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...

Любая помощь будет оценена по достоинству. Благодаря

4b9b3361

Ответ 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");
}