Web API - 使用 byte[] / MemoryStream 内容设置 Response.Content 无法正常工作

Web API - Setting Response.Content with byte[] / MemoryStream Contents not working properly

我的要求是使用WebAPI通过网络发送一个zip文件(依次包含一堆文件),该文件不应写在本地任何地方(不要写在server/client 磁盘)。对于压缩,我使用的是 DotNetZip - Ionic.Zip.dll

服务器代码:

public async Task<IHttpActionResult> GenerateZip(Dictionary<string, StringBuilder> fileList)
    { 
// fileList is actually a dictionary of “FileName”,”FileContent”
        byte[] data;
        using (ZipFile zip = new ZipFile())
        {
            foreach (var item in filelist.ToArray())
            {
                zip.AddEntry(item.Key, item.Value.ToString());
            }

            using (MemoryStream ms = new MemoryStream())
            {
                zip.Save(ms);
                data = ms.ToArray();
            }            
        }

        var result = new HttpResponseMessage(HttpStatusCode.OK);
        MemoryStream streams = new MemoryStream(data);
        //, 0, data.Length-1, true, false);
        streams.Position = 0;

        //Encoding UTFEncode = new UTF8Encoding();
        //string res = UTFEncode.GetString(data);
        //result.Content = new StringContent(res, Encoding.UTF8, "application/zip");
        <result.Content = new StreamContent(streams);
        result.Content.Headers.ContentType = new MediaTypeHeaderValue("application/zip");
        //result.Content.Headers.ContentLength = data.Length;
        result.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment");
        result.Content.Headers.ContentDisposition.FileName = "test.zip";
        return this.Ok(result);
    }

我面临的问题是,在客户端下载的 zip 文件修改为 test.bin 后,其流内容(本例内容中的 byte[] 数据)丢失了。 (我正在取回 test.zip 文件。当我在本地将文件从 test.zip 更改为 test.bin 时,我看到文件的内容如下所示。它不包含 Response.Content 值。P.S。我也尝试过 MIME 类型“application/octet-stream”。不走运!)

Test.zip 又名 test.bin 的内容:

{"version":{"major":1,"minor":1,"build":-1,"revision":-1,"majorRevision":-1 ,"minorRevision":-1},
"content":{"headers":[{"key":"Content-Type","value":["application/zip"]},
{"key":"Content-Disposition","value":["attachment; filename=test.zip"]}]},
"statusCode":200,"reasonPhrase":"OK","headers":[],"isSuccessStatusCode":true}

有人可以帮助我如何使用 MemoryStream 对象设置 result.Content(我在 google 的其他地方看到过“FileStream”的示例来设置“result.Content ” 但我只想使用 MemoryStream 对象!)。 我强调这一点是因为我认为问题在于将 MemoryStream 对象设置为 result.Content(以便将流内容正确保存到 result.Content 对象)

P.S。我也浏览了 Uploading/Downloading Byte Arrays with AngularJS and ASP.NET Web API(以及其他一些链接),但对我帮助不大……:( 任何帮助是极大的赞赏。非常感谢:)

我的问题解决了!!

我所做的只是将响应类型更改为 HttpResponseMessage 并在最后一行使用 "return result" 而不是 Ok(result) { 即 HttpResponseMessage 类型而不是 OKNegiotatedContentResult 类型)