C# 如何在ASP.NET WebAPI中返回文件
我尝试在.NET Framework 4.7.1中创建一个简单的WebAPI控制器,其中一个GET端点返回一个文件(在本例中为PDF),但当我调用它时,它返回一个JSON,其中包含请求信息。我不明白为什么,你能告诉我我的错误在哪里吗 我尝试返回不同的HttpContent,如StreamContent或ByteArrayContent,尝试从或复制响应,但似乎总是以相同的请求信息结束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
[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添加了内容类型的修复程序:)