我已经编写了一种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;
}