Web API:无法在“ PushStreamContent”中引发任何异常

时间:2018-08-29 11:32:52

标签: exception asp.net-web-api2 task httpresponse pushstreamcontent

我已经编写了一种Web API方法,可以将多个文件下载为zip文件。如果zip文件为空,则需要抛出一个错误,指出“找不到文档”,所以我尝试了以下代码,但是下载了空zip文件,并且没有抛出验证错误。我哪里做错了? 注意:如果我在“ pushstreamcontent”对象

之外尝试它,它将正常工作/抛出

我的API方法,

public async Task<HttpResponseMessage> DownloadMultiDocumentAsync(IClaimedUser user, List<Document> documentList)
{

        CloudBlockBlob blob = null;
        //azure storage connection
        var container = GetBlobClient(tenantInfo);
        //directory reference
        var directory = container.GetDirectoryReference(
            string.Format(DirectoryNameConfigValue, tenantInfo.TenantId.ToString(), documentList[0].ProjectId));

        long streamcontentCount = 0;
        var pushStreamContent = new PushStreamContent((outputStream, httpContent, transportContext) =>
        {
            //zip the multiple files
            using (var zipEntry = new ZipArchive(outputStream, ZipArchiveMode.Create, leaveOpen: false))
            {
                for (int docId = 0; docId < documentList.Count; docId++)
                {
                    blob = directory.GetBlockBlobReference(DocumentNameConfigValue + documentList[docId].DocumentId);
                    if (!blob.Exists())
                        throw new InvalidOperationException("No Documents found in blob storage");

                    MemoryStream memStream = new MemoryStream();
                    blob.DownloadToStreamAsync(memStream);
                    memStream.Position = 0;
                    var createEntry = zipEntry.CreateEntry(documentList[docId].FileName, CompressionLevel.Fastest);
                    using (var stream = createEntry.Open())
                    {
                        memStream.CopyTo(stream);
                        streamcontentCount++;
                    }
                }

            }
        });

        HttpResponseMessage httpResponseMessage = new HttpResponseMessage();
        httpResponseMessage.Content = pushStreamContent;
        httpResponseMessage.Content.Headers.ContentType = new MediaTypeHeaderValue("application/octet-stream");
        httpResponseMessage.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment");
        httpResponseMessage.Content.Headers.ContentDisposition.FileName = "Documents.zip";
        httpResponseMessage.StatusCode = HttpStatusCode.OK;
        return httpResponseMessage;

  }

0 个答案:

没有答案