我正在将 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 请求传递它并不是一个真正的选择。