2012-09-05 3 views
0

ASP.NET 웹 API로 구현 된 서비스에 CSV 내보내기를 추가하고 있습니다.ASP.NET 웹 API를 사용하여 내 보낸 파일 다운로드

현재 ajax POST 요청을 통해 웹 API 컨트롤러로 전송되는 뷰 모델 (결과 필터링 정보 포함)이 있습니다. 그러면 UI에서 JSON 응답이 렌더링됩니다. 이것은 잘 작동합니다.

이제 다른 컨트롤러에 동일한보기 모델을 게시하고 싶습니다. 이름을 ExportController으로 지정하겠습니다. 그런 다음 파일을 사용자에게 다운로드해야합니다.

내 생각 :

  1. 사후 서비스에 뷰 모델은 영구 저장소에 어딘가에 저장 (DB 또는 메모리 내 캐시, 중요하지 않습니다) 및 사용자에게 수출 토큰을 반환합니다.

  2. 는 다음 URL 에 그 토큰과 iframe에서 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. 이 접근법이 제정신입니까? (DB에 상태가 저장되어 있습니까?) 그런 작업이 다른 방식으로 수행되어야합니까?
  3. ASP.NET 웹 API는 이러한 작업에 적합합니까? 아니면 일반적인 ASP.NET 컨트롤러를 사용해야 내 보내야합니까?

UPDATE : 서버에 게시 된 데이터가 너무 GET 요청을 통해 전달, URL의 아이폰에 제한을 초과 할 수는 정말 옵션이 아닙니다.

답변

0

이 프로젝트에서 나는 깨끗한 RESTful 백엔드를 작성하고 ExportController을 일반적인 MVC 컨트롤러로 변환했다. 그럼 난 Get 방법과 같은 일을

Session[exportId] = filters; 

Post 방법

ExportArgumentProvider.AddFilter(guid, filters); 

이 줄을 변경하고 할 수 있었다.

은 여전히 ​​DB에서 필터를 저장와 그 접근 방식이 훨씬 더 생각하지만,

  1. 정말하지 여기 REST API를해야합니다.
  2. 너무 많은 오버 헤드를 코드에 추가합니다. 단지 API의 순수성을 위해 추가하려고합니다.
0

두 요청을 하나로 결합하는 것이 좋습니다. "내보내기"URL을 모두 매개 변수로 가져 와서 "즉시"내보낼 수 있습니다. 쿼리 문자열에 많은 양의 데이터 만 채울 수있는 약간의 제한이 있습니다. 따라서이 방법이 효과가 없을 수도 있지만, 문제가 상당히 간단해질 것이므로 권장 할 것입니다.

"postData"(구성 요소의 첫 번째 부분)가 "충분히 작다"고 가정하면 "내보내기"URL의 쿼리 문자열에 직렬화 한 다음 끝점을 함께 결합하면됩니다 URL은 데이터 필터링 등을 처리합니다.)

+0

postData'가 충분히 작지 않다'는 사실은 모든 문제의 열쇠 :( –

+0

당신은 당신의 iframe이있을 수 있습니다 당신을 위해 게시물을 여전히 모든 것을 함께 "결합"엔드 포인트 거래를해야합니다. – Chris

+0

정확히 어떻게 그것은 구현됩니까? –

관련 문제