如何在ASP.NET WebAPI中返回文件

时间:2019-07-02 15:06:10

标签: c# asp.net

我尝试在.NET Framework 4.7.1中创建一个带有一个GET Endpoint的简单WebAPI控制器,该GET Endpoint返回一个文件(在这种情况下为PDF),但是当我调用它时,它将返回一个带有请求信息的JSON。我不知道为什么,你能告诉我我的错误在哪里吗?

我尝试返回不同的HttpContent(例如StreamContent或ByteArrayContent),尝试复制来自https://www.aspsnippets.com/Articles/Return-Download-File-using-Web-API-in-ASPNet-MVC.aspx或{{3}}的响应,但是它似乎总是以相同的请求信息结尾。

[HttpGet]
[Route("GetReport")]
public HttpResponseMessage GetReport()
{
     FileStream stream = System.IO.File.Open(PDF_TEMP_PATH, FileMode.Open);

     var result = new HttpResponseMessage(HttpStatusCode.OK)
     {
         Content = new StreamContent(stream)
     };

     result.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment")
     {
         FileName = "test.pdf"
     };

     result.Content.Headers.ContentType = new MediaTypeHeaderValue("application/pdf");

     return result;
}

结果是:

  

{“版本”:{“主要”:1,“次要”:1,“构建”:-1,“修订”:-1,“主要修订”:-1,“次要修订”:-1}, “ content”:{“ headers”:[{“ key”:“ Content-Disposition”,“ value”:[“ attachment; filename = test.pdf”]},{“ key”:“ Content-Type”,“ value“:[” application / pdf“]}]},” statusCode“:200,” reasonPhrase“:” OK“,” headers“:[],” requestMessage“:null,” isSuccessStatusCode“:true}

但是显然,我希望改为使用Stream中的PDF。

2 个答案:

答案 0 :(得分:2)

这就是您需要的

       HttpResponseMessage result = new HttpResponseMessage(HttpStatusCode.OK)
        {
             Content = new StreamContent(stream),
        };

        result.Content.Headers.ContentDisposition = new System.Net.Http.Headers.ContentDispositionHeaderValue("attachment")
        {
            FileName = "Test.pdf"
        };

        result.Content.Headers.ContentType = new MediaTypeHeaderValue("application/octet-stream");

        return ResponseMessage(result);

答案 1 :(得分:-1)

您可以(应该?)使用ActionResults从您的API返回数据。

[HttpGet]
[Route("GetReport")]
public ActionResult GetReport()
{
     return File(System.IO.File.OpenRead(PDF_TEMP_PATH), "application/pdf");
}

您只需要相应地设置ContentType

另一种好的做法是使您的方法async变为无效阻塞。