繁体   English   中英

将HttpResponseBase转换为IHttpActionResult

[英]Convert HttpResponseBase to IHttpActionResult

如何在Web API控制器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 ????
}

您当前的ZipFilesToResponse方法是为常规MVC(而非Web API)构建的。 一种选择是简单地将此动作移至MVC控制器而不是Web API控制器。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM