在 ASP.NET MVC 5 控制器中使用 POST 从 dotnet Core Web API 下载文件
Posted
技术标签:
【中文标题】在 ASP.NET MVC 5 控制器中使用 POST 从 dotnet Core Web API 下载文件【英文标题】:Download file from dotnet Core Web API using POST in ASP.NET MVC 5 controller 【发布时间】:2020-10-16 07:48:05 【问题描述】:我需要从 dotnet Core Web API 下载文件。控制器接受 POST 请求,如下所示:
[HttpPost]
[Route("api/pdf")]
//[Consumes("application/octet-stream")]
[Produces("application/pdf")]
public IActionResult GetPDF([FromBody] ReportRequest request)
//report generation logic
return new FileStreamResult(pdfMemoryStream, "application/pdf");
我不确定如何将 POST 请求从 ASP.NET MVC 5 控制器发送到此 dotnet 核心 API 控制器
我试过WebClient.UploadData(action, "POST", requestBytes);
,其中requestBytes
是使用BinaryFormatter
获得的模型的字节数组,但API 控制器拒绝它说(406) Not Acceptable.
无论 API 控制器上的 [Consumes("application/octet-stream")]
是什么,都会发生这种情况。
并且没有允许 POST JSON 的 WebClient.UploadData
重载。
任何例子都将不胜感激。
【问题讨论】:
【参考方案1】:将 GetPdf 方法更改为:
[Consumes("application/json")]
public IActionResult GetPDF([FromBody] ReportRequest request)
//report generation logic
return File(pdfMemoryStream.ToArray(), "application/pdf");
并使用HttpClient
而不是WebClient
:
var client = new HttpClient();
string url = "https://localhost:44398/api/values/GetPdf";
var reportRequest = new ReportRequest()
Id = 1,
Type = "Billing"
;
var json = JsonConvert.SerializeObject(reportRequest);
var data = new StringContent(json, Encoding.UTF8, "application/json");
var response = await client.PostAsync(url, data);
response.EnsureSuccessStatusCode();
var bytes = await response.Content.ReadAsByteArrayAsync();
【讨论】:
使用这个给了我相同的 406 Not Acceptable 状态代码。 在 GetPdf 方法中尝试return File(pdfMemoryStream.ToArray(), "application/pdf");
做到了!如果您可以将此评论添加到您的原始答案中,我想将其标记为已接受的答案。
我还必须使用 [Consumes("application/json")]
装饰 GetPdf API 操作才能使用您的代码。以上是关于在 ASP.NET MVC 5 控制器中使用 POST 从 dotnet Core Web API 下载文件的主要内容,如果未能解决你的问题,请参考以下文章
在 ASP.NET MVC 5 控制器中使用 POST 从 dotnet Core Web API 下载文件
如何在 ASP .NET MVC 5 中使用 select2 将新值动态添加到列表框并将其传递给控制器?