2017-12-22 34 views
0

Wie implementieren Sie die folgende Funktion in IHttpActionResult Aktion, Web API Controller?Convert HttpResponseBase in IHttpActionResult

Muss ich die HttpResponseBase zu etwas anderem ändern?

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(); 
} 

Zu hier in Anspruch genommen:

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

Ich habe nicht die vollständige Antwort, aber es kann dies lesen helfen: https://stackoverflow.com/a/47397666/1220550 –

Antwort

1

Ihre aktuelle ZipFilesToResponse Methode ist für die regelmäßige MVC gebaut, nicht Web-API. Eine Option wäre, diese Aktion einfach in einen MVC-Controller anstelle eines Web-API-Controllers zu verschieben.

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"); 
    } 
} 

Sie brauchen nichts zurück, da Ihre ZipFilesToResponse Verfahren direkt an das HttpContext.Response Objekt schreibt.

Alternativ können Sie die Methode ZipFilesToResponse ändern, um eine HttpResponseMessage zu erstellen und diese dann von Ihrer Aktion zurückzugeben, wenn Sie bei der reinen Web-API bleiben möchten.

[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

Auch eine IHttpActionResult in DownloadFiles mit Ihrem Code zurückkehren kann man schreibe 'return ResponseMessage (ZipContentResult (dateien));'. Obwohl es keinen zusätzlichen Vorteil bringt. – ckuri

+0

Am Frontend startet der Download nicht automatisch. Fehle ich etwas? –

+0

@ShyamalParikh Was passiert, wenn Sie den Endpunkt (/ DownloadFiles/...) treffen? Irgendwelche Fehler zurückgegeben? Ich erkannte, dass ich in meinem zweiten Beispiel [HttpGet] anstelle von [HttpPost] verwendet habe, und stelle sicher, dass ich dies an deine Anforderungen anpasse. –

Verwandte Themen