Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/275.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/37.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在ASP.NET WebAPI中返回文件_C#_Asp.net - Fatal编程技术网

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

C# 如何在ASP.NET WebAPI中返回文件,c#,asp.net,C#,Asp.net,我尝试在.NET Framework 4.7.1中创建一个简单的WebAPI控制器,其中一个GET端点返回一个文件(在本例中为PDF),但当我调用它时,它返回一个JSON,其中包含请求信息。我不明白为什么,你能告诉我我的错误在哪里吗 我尝试返回不同的HttpContent,如StreamContent或ByteArrayContent,尝试从或复制响应,但似乎总是以相同的请求信息结束 [HttpGet] [Route("GetReport")] public HttpResponseMessag

我尝试在.NET Framework 4.7.1中创建一个简单的WebAPI控制器,其中一个GET端点返回一个文件(在本例中为PDF),但当我调用它时,它返回一个JSON,其中包含请求信息。我不明白为什么,你能告诉我我的错误在哪里吗

我尝试返回不同的HttpContent,如StreamContent或ByteArrayContent,尝试从或复制响应,但似乎总是以相同的请求信息结束

[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,“minorRevision”:-1},“内容”:{“标题”:[{“关键字”:“内容处置”,“值”:[“附件;文件名=test.pdf”]},{“关键字”:“内容类型”,“值”:[“应用程序/pdf”]}}],“状态码”:200,“理由短语”:“确定”,“标题”:[],“请求消息”:null,“isSuccessStatusCode”:true}

但很明显,我希望流中有PDF格式。

以下是您需要的内容

       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);
您可以(应该?)使用ActionResults从API返回数据

[HttpGet]
[路线(“获取报告”)]
公共行动结果GetReport()
{
返回文件(System.IO.File.OpenRead(PDF_TEMP_PATH),“application/PDF”);
}
您只需相应地设置
ContentType


另一个好的做法是使您的方法无效阻塞。

您使用的是什么版本的Web API?核心?版本信息来自哪里?你安装了一些过滤器吗?版本是.NET Framework 4.7.1,我将在问题中添加信息。我不知道Jeroen Heier在版本信息问题上的意思,你能澄清一下吗?我没有安装任何过滤器。@Rwandrall这个JSON字符串是从哪里来的。NET属性永远不会以小写开头。您是否将响应转换为JSON,而不是从中读取?您是如何调用WebAPI方法的?发布您的客户端代码Json来自我调用端点时从导航器获得的结果。感谢您的回复,但我不能使用ResponseMessage(),因为项目使用.Net Framework 4.7.1而不是Core,我将相应地修改问题。我试图将ContentType更改为“application/octet stream”,但得到的结果与问题中描述的相同。@Rwandrall来自.net 4.7,如果使用core,则返回ActionResult@Rwandrall.NET属性从不以小写字母开头。你从哪里得到JSON字符串的?更新问题并发布客户代码。很可能您正在将Javascript调用的响应转换为JSON,而不是使用它
async
与lockingThanks@PanagiotisKanavos无关。您是对的。我的意思是阻止而不是锁定。@Rwandrall不,它不是,除非这逆转了客户端错误。副本和其他答案有效。如果没有,人们几年前就会注意到。如何使用此代码设置内容类型或处置?@Rwandrall这意味着,如果调用此操作时,除您的代码以外的任何代码都将失败,除非它复制客户端bug@PanagiotisKanavos添加了内容类型的修复程序:)