【发布时间】:2018-04-11 15:40:21
【问题描述】:
我在一个 asp.net 核心应用程序上有几个导出路由,但所有这些路由都通过 GET 请求访问,例如:/api/{projectid}/{parameter}
这些请求正在生成 xlsx 文件并将它们发送到客户端。现在我有一个类似的请求,但是我必须将一个长数组传递给该方法,所以我想将它变成一个 POST 方法并在 http 正文中发送数组(和其他参数)。
我从服务器得到了正确的响应(一个以 PK 开头的数组缓冲区...),但我不能告诉 Angular 将它保存为文件,就像我对类似的 GET 请求所做的那样。如果我将其重写以启动 GET 请求,则它可以正常工作。我做错了什么?
控制器方法:
[HttpPost("[action]")]
public IActionResult Export([FromBody] DistributionExportPostModel model)
{
var project = _ctx.Projects.FirstOrDefault(x=>x.Id == model.ProjectId);
byte[] xlsx = createXlsxFile(project, model.Selection, model.ComparisonBase);
var mimeType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
var fileName = $"TaskExport-"+project.Name+"-"+DateTime.Now.ToString("yyyyMMddHHmmss")+".xlsx";
return File(xlsx, mimeType, fileName);
}
Angular 提供者方法:
export(projectid:string, selection:string[], comparisonBase:string):Promise<any[]> {
//let headers:Headers = new Headers();
//headers.append('Accept', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
//let params: URLSearchParams = new URLSearchParams();
let requestOptions = new RequestOptions();
requestOptions.responseType = ResponseContentType.ArrayBuffer;
return new Promise<any[]>((resolve) =>
this.http.post('/api/Distribution/Export', {
//'+projectid+'/'+comparisonBase+'/'+selection.join(','),
'ProjectId': projectid,
'Selection': selection,
'ComparisonBase': comparisonBase
}, requestOptions).subscribe((res) => {
window.open(res.url, '_blank');
resolve();
})
);
}
【问题讨论】:
标签: c# asp.net-mvc angular typescript asp.net-core