0

我正在将 CSV 导出添加到使用 ASP.NET Web API 实现的服务中。

目前我有一个视图模型(包含结果过滤的详细信息),它通过 ajax POST 请求发送到 Web API 控制器。然后在 UI 上呈现 JSON 响应。这工作得很好。

现在我想将相同的视图模型发布到另一个控制器,让我们命名它ExportController。然后我需要将文件下载给用户。

我的点子:

  1. 将视图模型发布到服务,将其存储在持久存储(数据库或内存缓存,无关紧要)中的某个位置,并将导出令牌返回给用户。(出口令牌是指用于识别此特定出口的一条信息)

  2. 然后使用 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方法的返回类型。

所以,问题:

  1. 是否有更简单的方法来进行此导出(不将过滤器状态存储在数据库中)。
  2. 这种方法是否合理(状态存储在数据库等中),还是应该以其他方式完成此类任务?
  3. ASP.NET Web API 是否适合此类任务,或者我应该求助于通常的 ASP.NET 控制器进行导出?

更新:发布到服务器的数据可能超过 URL 长度限制,因此通过 GET 请求传递它并不是一个真正的选择。

4

2 回答 2

0

我建议将这两个请求合二为一:使“导出” URL 采用所有参数,以便“即时”执行导出。有一点限制,您只能将这么多数据填充到查询字符串中,因此这可能对您不起作用,但我建议您这样做(因为它会大大简化问题)。

假设“postData”(在组件的第一部分)“足够小”,那么您只需将其序列化为您的“导出”URL 的查询字符串,然后将端点组合在一起(以便导出 URL 处理过滤数据/等)。

于 2012-09-05T21:59:06.770 回答
0

对于这个项目,我放弃了创建干净的 RESTful 后端并转换ExportController为通常的 MVC 控制器。然后我能够在Post方法中更改这一行

ExportArgumentProvider.AddFilter(guid, filters);

进入

Session[exportId] = filters;

Get并用该方法做同样的事情。

我仍然认为在数据库中存储过滤器的方法要好得多,但是

  1. 我在这里并不需要 REST API。
  2. 它在代码中引入了太多的开销,比我想添加的“只是为了 API 的纯度”要多得多。
于 2012-09-18T13:01:55.133 回答