从 C# Web api 方法下载 ZipArchive 在 chrome 中返回“net::ERR_CONNECTION_RESET”

Nat*_*ous 2 c# asp.net-web-api

我想调用一个 Web api 方法并让它允许用户下载我在内存中创建的 zip 文件。我也想在内存中创建条目。

我无法让服务器正确输出下载。

这是我的网络 API 方法:

[HttpGet]
[Route("api/downloadstaffdata")]
public HttpResponseMessage DownloadStaffData()
{
    var response = new HttpResponseMessage(HttpStatusCode.OK);
    using (var stream = new MemoryStream())
    {
        using (var archive = new ZipArchive(stream, ZipArchiveMode.Create, true))
        {
            //future for loop to create entries in memory from staff list
            var entry = archive.CreateEntry("bob.txt");
            using (var writer = new StreamWriter(entry.Open()))
            {
                writer.WriteLine("Info for: Bob");
            }
            //future add staff images as well
        }
        stream.Seek(0, SeekOrigin.Begin);
        response.Content = new StreamContent(stream);
    }
    response.Content.Headers.ContentDisposition = new System.Net.Http.Headers.ContentDispositionHeaderValue("attachment")
    {
        FileName = "staff_1234_1.zip"
    };
    response.Content.Headers.ContentType = new System.Net.Http.Headers.MediaTypeHeaderValue("application/zip");

    return response;
}
Run Code Online (Sandbox Code Playgroud)

这是我的调用js代码:

window.open('api/downloadstaffdata');
Run Code Online (Sandbox Code Playgroud)

以下是 Chrome 的响应:

net::ERR_CONNECTION_RESET

我不知道我做错了什么。我已经搜索过 SO 并阅读了有关创建 zip 文件的文章,但在尝试将 zip 存档返回给客户端时,我无法通过连接重置错误。

有任何想法吗?

Shu*_*rFu 5

你的内存流位于一个using块内。因此,在控制器有机会将其写出之前,您的内存流已被释放(因此是ERR_CONNECTION_RESET)。

MemoryStream 不需要显式处置(可能需要显式处置其各种派生类型,但 MemoryStream 本身不需要)。垃圾收集器可以自动清理它。