PDF, возвращенный из Web API, открыть нельзя.При открытии этого документа произошла ошибка.Файл поврежден и не может быть восстановлен - PullRequest
0 голосов
/ 26 апреля 2019

У меня есть контроллер веб-API, который возвращает PDF. Некоторые PDF-файлы не открываются Abobe Reader XI 11.0.12

HttpContext.Current.Response.ContentType = "application/pdf";
HttpContext.Current.Response.BinaryWrite(myByteArray);
HttpContext.Current.Response.End();

Приведенный выше код работает без ошибок, и PDF-файлы можно открывать в Adobe Reader, а также во всех популярных браузерах.

Но выдается «Сервер не может установить статус после отправки заголовков HTTP». который я игнорировал, но хотел бы разрешить, поэтому я реализую приведенный ниже код.

HttpContext.Current.Response.ContentType = "application/pdf";
HttpContext.Current.Response.Clear();
HttpContext.Current.Response.BufferOutput = true;
HttpContext.Current.Response.BinaryWrite(myByteArray);
HttpContext.Current.Response.Flush();

Этот код также работает без ошибок, но PDF, возвращенный из этого кода, нельзя открыть в Adobe Reader XI версии 11.0.12. FF, Chrome, Edge может показать PDF отлично. IE 11 не может.

При открытии этого документа произошла ошибка. Файл поврежден и не может быть отремонтировано.

enter image description here

1 Ответ

1 голос
/ 26 апреля 2019

На основе ответа @mason и ссылки Возвращение двоичного файла из контроллера в ASP.NET Web API Я заменил все HttpContext.Current.Response на следующий код для решения этой проблемы:

public HttpResponseMessage LoadPdf(int id)
{
    //get PDF in myByteArray

    //return PDF bytes as HttpResponseMessage
    HttpResponseMessage result = new HttpResponseMessage();
    Stream stream = new MemoryStream(myByteArray);
    result.Content = new StreamContent(stream);
    result.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment") { FileName = "my-doc.pdf" };
    result.Content.Headers.ContentType = new MediaTypeHeaderValue("application/pdf");
    result.StatusCode = HttpStatusCode.OK;
    return result;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...