我有一个 Web API 2 ApiController
使用以下 GET 方法:
[HttpGet]
public IHttpActionResult GetZip()
{
return new ZipFileActionResult();
}
我的自定义实现 IHttpActionResult
public class ZipFileActionResult : IHttpActionResult
{
public Task<HttpResponseMessage> ExecuteAsync(CancellationToken cancellationToken)
{
var memoryStream = new MemoryStream();
var response = new HttpResponseMessage(HttpStatusCode.OK);
using (var archive = new ZipArchive(memoryStream, ZipArchiveMode.Create, true))
{
var entry = archive.CreateEntry("MyFileName.txt");
using (var streamWriter = new StreamWriter(entry.Open()))
{
streamWriter.Write("It was the best of times, it was the worst of times...");
}
}
response.Content = new StreamContent(memoryStream);
response.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment")
{
FileName = "example.zip"
};
response.Content.Headers.ContentType = new MediaTypeHeaderValue("application/zip");
return Task.FromResult(response);
}
}
当我使用 Postman 获取时,我收到“无响应”。断点,其中 StreamContent
创建后显示流的长度约为 1000 字节。我错过了什么?
其他类似但不重复的问题
这个问题不是重复的,尽管它似乎有一些兄弟问题:
- ZipArchive creates invalid ZIP file但我没有保存到 Windows,所以我没有文件流。我还确保该流在
ZipArchive
之后保持打开状态已处置。 - Writing to ZipArchive using the HttpContext OutputStream但我并没有直接写信给
HttpContext.OutputStream
,当我流式传输到StreamContent
时,我可以使用更简单的MemoryStream
.
最佳答案
您必须将 memoryStream
位置重置为“0”,以便在写入响应时不会尝试从文件末尾开始。固定代码应如下所示:
using (var archive = new ZipArchive(memoryStream, ZipArchiveMode.Create, true))
{
var entry = archive.CreateEntry("MyFileName.txt");
using (var streamWriter = new StreamWriter(entry.Open()))
{
streamWriter.Write("It was the best of times, it was the worst of times...");
}
}
//ADD THIS LINE
memoryStream.Position = 0;
response.Content = new StreamContent(memoryStream);
关于c# - 如何在内存中构建ZipArchive并通过Web API 2中的IHttpActionResult下载?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37949087/