2012-09-05 100 views
0

我將CSV導出添加到使用ASP.NET Web API實現的服務中。使用ASP.NET Web Api導出文件下載

目前我有一個視圖模型(包含結果過濾的細節),它通過ajax POST請求發送到Web API控制器。 JSON響應然後在UI上呈現。這工作得很好。

現在我想將相同的視圖模型發佈到另一個控制器,我們將其命名爲ExportController。然後我需要將文件下載到用戶。

我的想法:

  1. 後視圖模型的服務,在一些地方保存它的持久性存儲(DB或內存中緩存,無所謂),並返回一個出口令牌的用戶。 (通過出口令牌我的意思的一條信息用於識別該特定的出口)

  2. 然後從iframe與該令牌在URL 執行GET請求並獲得文件作爲響應於該請求。

我現在什麼,在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. 有沒有使這個出口(不含在DB存儲過濾狀態)更簡單的方法。
  2. 這種方法是否理智(狀態存儲在數據庫等),或者這些任務應該以另一種方式完成?
  3. ASP.NET Web API很適合這樣的任務,或者我應該訴諸通常的ASP.NET控制器來導出?

UPDATE:發送到服務器的數據可能超出URL lenght限制,通過GET請求,以便通過它不是一個真正的選擇。

回答

0

對於這個項目,我放棄了創建乾淨和RESTful後端並將ExportController轉換爲通常的MVC控制器。然後,我能夠改變這條線在Post方法

ExportArgumentProvider.AddFilter(guid, filters); 

Session[exportId] = filters; 

和做同樣的事情與Get方法。

我仍然認爲,在DB存儲過濾器的做法要好得多,但

  1. 我並不真的需要在這裏REST API。
  2. 它在代碼中引入了太多的開銷,遠遠超過我想添加「僅僅是爲了API純度」。
0

我建議只需將兩個請求合併爲一個:使「導出」URL採取所有參數都是「即時」導出。有一個小小的限制,你只能將太多的數據填入查詢字符串中,所以這可能對你沒有用,但我會建議去做(因爲它會簡化這個問題)。

假設「postData」(在組件的第一部分)「足夠小」,那麼您只需將其序列化到「導出」URL的查詢字符串中,然後將端點組合在一起(例如導出URL處理數據/等的過濾)。

+0

事實上,'postData'不夠小是你可以讓你的iframe的關鍵,所有的問題:( –

+0

做後你仍然有「組合拳」端點處理一切。 – Chris

+0

究竟如何是否實施? –