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

C# 无法打开从Web API返回的PDF。打开此文档时出错。文件已损坏,无法修复,c#,asp.net-mvc,pdf,asp.net-web-api,C#,Asp.net Mvc,Pdf,Asp.net Web Api,我有一个返回PDF的web api控制器。一些PDF文件没有被读者席XI 110.12打开。 HttpContext.Current.Response.ContentType = "application/pdf"; HttpContext.Current.Response.BinaryWrite(myByteArray); HttpContext.Current.Response.End(); 上述代码可以正常工作,并且PDF可以在Adobe Reader中以及所有流行浏览器中打开 但它确实

我有一个返回PDF的web api控制器。一些PDF文件没有被读者席XI 110.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();

此代码也不出错,但是在Adobe Reader席XI版本110.12中无法打开从该代码返回的PDF。FF、Chrome、Edge可以显示PDF的精细。IE 11不能

打开此文档时出错。文件已损坏,无法使用 无法修复


基于@mason response和链接,我用以下代码替换了所有
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;
}

如果一个浏览器可以读取该PDF,而另一个浏览器不能,则表明您在错误的位置查找问题。这很可能是PDF内容的问题,而不是您将其发送到浏览器的方式。您能否提供有关binaryObject来源的代码?我看不到这个变量正在初始化任何需要在写入文件字节后结束响应的地方。否则,其他内容将最终写入文件,从而损坏PDF。无论如何,为什么要直接在Web API中编写响应。不要那样做!Web API有。您可能得到“发送HTTP头后服务器无法设置状态”。因为您将头写入响应,然后结束响应,从而导致异常,从而导致Web API尝试将HTTP状态代码设置为500,从而导致其他错误。所有这些都可以通过从操作方法正确返回文件来避免。在Web API中,您不应该写入响应。那不是你的工作。这是框架的工作。因此,代码中所有的
HttpContext.Current.Response
调用都需要消失。相反,返回包含文件内容的操作结果。您可以轻松地在web API中搜索如何返回文件。