我正在将 CSV 导出添加到使用 ASP.NET Web API 实现的服务中。
目前我有一个视图模型(包含结果过滤的详细信息),它通过 ajax POST 请求发送到 Web API 控制器。然后在 UI 上呈现 JSON 响应。这工作得很好。
现在我想将相同的视图模型发布到另一个控制器,让我们命名它ExportController
。然后我需要将文件下载给用户。
我的点子:
将视图模型发布到服务,将其存储在持久存储(数据库或内存缓存,无关紧要)中的某个位置,并将导出令牌返回给用户。(出口令牌是指用于识别此特定出口的一条信息)
然后使用 URL 中的令牌执行
GET
来自 的请求,iframe
并获取文件作为对该请求的响应。
我现在在 UI 上拥有的东西:
var exportUrl = "URL to ExportController"
$.ajax(exportUrl, {
type: 'POST',
contentType: 'application/json',
data: postData
})
.success(function(data) {
// this should download the file
$('#export').attr('src', exportUrl + '&exportToken=' + data);
});
这里的“#export”是iframe
用于下载文件的元素。
这是导出后端的原始草图:
public class ExportController : ApiController
{
...
// GET /api/Export
public string Get(string exportToken)
{
// get filters from DB
var filters = ExportArgumentProvider.GetFilters(exportToken);
// get data
var result = DataSource.GetData(filters);
return result;
}
// POST /api/Export
public string Post(FilterInput filters)
{
var guid = Guid.NewGuid();
// save filters to DB
ExportArgumentProvider.AddFilter(guid, filters);
return guid.ToString();
}
}
这个伪代码显然是行不通的,请忽略Get方法的返回类型。
所以,问题:
- 是否有更简单的方法来进行此导出(不将过滤器状态存储在数据库中)。
- 这种方法是否合理(状态存储在数据库等中),还是应该以其他方式完成此类任务?
- ASP.NET Web API 是否适合此类任务,或者我应该求助于通常的 ASP.NET 控制器进行导出?
更新:发布到服务器的数据可能超过 URL 长度限制,因此通过 GET 请求传递它并不是一个真正的选择。