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

时间:2016-03-25 14:25:34

标签: asp.net-web-api httpcontent

我的要求是使用Web API通过网络发送一个zip文件(依次包含一堆文件),不应该在本地任何地方写入(不写在服务器/客户端磁盘上的任何地方)。对于压缩,我使用的是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时,我看到File的内容如下所示。它不包含Response.Content值.PS我有还尝试了MIME类型“application / octet-stream”。没有运气!)

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

{&#34;版本&#34; {&#34;主要&#34;:1,&#34;轻微&#34;:1,&#34;建立&#34;: - 1,&#34;修订& #34;: - 1,&#34; majorRevision&#34;: - 1,&#34; minorRevision&#34; - 1},
&#34;内容&#34; {&#34;头&#34;:[{&#34;键&#34;:&#34;内容类型&#34;&#34;值&#34 ;: [&#34;应用程序/压缩&#34;]},
{&#34;键&#34;:&#34;内容处置&#34;&#34;值&#34;:[&#34;附件;文件名= test.zip&#34;]}]},
&#34;的StatusCode&#34;:200,&#34; reasonPhrase&#34;:&#34; OK&#34;&#34;头&#34;:[],&#34; isSuccessStatusCode&#34 ;:真}

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

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

1 个答案:

答案 0 :(得分:0)

我的问题解决了!!

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