从Web API返回的PDF无法打开。打开此文档时出错。文件已损坏,无法修复

时间:2019-04-26 16:30:15

标签: c# asp.net-mvc pdf asp.net-web-api

我有一个Web API控制器,正在返回PDF。 Abobe Reader XI 11.0.12无法打开某些PDF

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

以上代码可以正常工作,并且可以在Adobe Reader和所有流行的浏览器中打开PDF。

但是它确实抛出“发送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 个答案:

答案 0 :(得分:1)

基于@mason响应和链接Returning binary file from controller in 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;
}