2017-12-22 21 views
0

Web APIコントローラのIHttpActionResultアクションで次の関数を実装する方法は?HttpResponseBaseをIHttpActionResultに変換する

HttpResponseBaseを別のものに変更する必要がありますか?ここで利用されることが

public void ZipFilesToResponse(HttpResponseBase response, IEnumerable<Asset> files, string zipFileName) 
{ 
    using (var zipOutputStream = new ZipOutputStream(response.OutputStream)) 
    { 
     zipOutputStream.SetLevel(0); // 0 - store only to 9 - means best compression 
     response.BufferOutput = false; 
     response.AddHeader("Content-Disposition", "attachment; filename=" + zipFileName); 
     response.ContentType = "application/octet-stream"; 

     foreach (var file in files) 
     { 
      var entry = new ZipEntry(file.FilenameSlug()) 
      { 
       DateTime = DateTime.Now, 
       Size = file.Filesize 
      }; 
      zipOutputStream.PutNextEntry(entry); 
      storageService.ReadToStream(file, zipOutputStream); 
      response.Flush(); 
      if (!response.IsClientConnected) 
      { 
       break; 
      } 
     } 
     zipOutputStream.Finish(); 
     zipOutputStream.Close(); 
    } 
    response.End(); 
} 

[HttpPost] 
[Route("DownloadFiles/{company_id}")] 
public IHttpActionResult DownloadFiles(Int64 company_id, TasksFilterModel searchModel) 
{ 
    var files = .....; 
    ZipFilesToResponse(_______,files,"download.zip"); 
    return ???? 
} 
+0

私は完全な答えを持っていないが、これは読むために役立つことがあります。https://stackoverflow.com/a/47397666/1220550 –

答えて

1

あなたの現在のZipFilesToResponse方法は通常のMVCではなく、ウェブAPIのためのより多くを構築されています。 1つのオプションは、このアクションをWeb APIコントローラーではなくMVCコントローラーに移動することです。

public class MyController : Controller 
{ 
    [HttpPost] 
    [Route("DownloadFiles/{company_id}")] 
    public void DownloadFiles(Int64 company_id, TasksFilterModel searchModel) 
    { 
     var files = ...; 
     ZipFilesToResponse(HttpContext.Response, files, "download.zip"); 
    } 
} 

あなたZipFilesToResponse方法はHttpContext.Responseオブジェクトに直接書き込みを行うので、あなたは何を返す必要はありません。

また、Web APIを純粋に使用する場合はZipFilesToResponseメソッドを変更してHttpResponseMessageを作成し、それを元に戻すことができます。

[Route("DownloadFiles")] 
[HttpGet] 
public HttpResponseMessage DownloadFiles() 
{ 
    var files = ...; 
    return ZipContentResult(files, "download.zip"); 
} 

protected HttpResponseMessage ZipContentResult(IEnumerable<Asset> files, string zipFileName) 
{ 
    var pushStreamContent = new PushStreamContent((stream, content, context) => 
    { 
     using (var zipOutputStream = new ZipOutputStream(stream)) 
     { 
      zipOutputStream.SetLevel(0); // 0 - store only to 9 - means best compression 

      foreach (var file in files) 
      { 
       var entry = new ZipEntry(file.FilenameSlug()) 
       { 
        DateTime = DateTime.Now, 
        Size = file.Filesize 
       }; 
       zipOutputStream.PutNextEntry(entry); 
       storageService.ReadToStream(file, zipOutputStream); 
       stream.Flush(); 
      } 
      zipOutputStream.Finish(); 
      zipOutputStream.Close(); 
     } 
     stream.Close(); 
    }, "application/zip"); 

    pushStreamContent.Headers.Add("Content-Disposition", "attachment; filename=" + zipFileName); 

    return new HttpResponseMessage(HttpStatusCode.OK) { Content = pushStreamContent }; 
} 
+1

また、あなたのコード1缶でDownloadFilesにIHttpActionResultを返すために、返信ResponseMessage(ZipContentResult(files)); 'を返します。実際にはそれ以上のメリットはありません。 – ckuri

+0

フロントエンドのダウンロードが自動的に開始されません。私は何か不足していますか? –

+0

@ShyamalParikhエンドポイント(/ DownloadFiles/...)を押すとどうなりますか?エラーが返されましたか? 2番目の例では、[HttpPost]の代わりに[HttpGet]を使用していましたが、あなたの要件に合わせて変更してください。 –

関連する問題