PushStreamContent和ionic.zip

时间:2014-07-01 13:12:48

标签: c# asp.net-mvc asp.net-web-api dotnetzip ionic-zip

我的webapi方法即时使用此代码

var result = new HttpResponseMessage(HttpStatusCode.OK)
            {
                Content = new PushStreamContent((stream, content, arg3) =>
                {
                    using (var zipEntry = new Ionic.Zip.ZipFile())
                    {
                        using (var ms = new MemoryStream())
                        {
                            _xmlRepository.GetInitialDataInXml(employee, ms);
                            zipEntry.AddEntry("content.xml", ms);
                            zipEntry.Save(stream); //process sleep on this line
                        }

                    }
                })
            };

            result.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment")
            {
                FileName = "FromPC.zip"
            };
            result.Content.Headers.ContentType =
                new MediaTypeHeaderValue("application/octet-stream");


            return result;

我想

1)从_xmlRepository.GetInitialDataInXml

中获取数据

2)通过Ionic.Zip快速压缩数据

3)返回压缩流作为我的WebApi操作的输出

但是在这行zipEntry.Save(stream);执行过程停止,不要转到下一行。并且方法不返回任何内容

那为什么它不会'给我回复文件?

2 个答案:

答案 0 :(得分:1)

使用PushStreamContent时,您需要close信号流,表示您已完成写入信息流。

文档中的

Remarks部分:
http://msdn.microsoft.com/en-us/library/jj127066(v=vs.118).aspx

答案 1 :(得分:0)

接受的答案不正确。如果要开始流式传输,则无需关闭流。委托功能结束时,流式传输自动开始(浏览器中的下载对话框)。在大文件的情况下抛出OutOfMemoryException,但它被处理并且流式传输开始 - > HttResponseStream向客户端刷新。

$p("#flip_sector_"+sectionJs+"").click(function(){
  $p("#panel_sectors_"+sectionJs+"").slideToggle("slow");sectionJs++;