Как создать контроллер веб-API, который генерирует и возвращает сжатый zip файл, потоковый из коллекции файлов JPEG в памяти (объекты MemoryStream). Я пытаюсь использовать DotNetZip Library. Я нашел этот пример: http://www.4guysfromrolla.com/articles/092910-1.aspx#postadlink. Но Response.OutputStream недоступен в веб-API и поэтому техническая работа не совсем работает. Поэтому я попытался сохранить zip файл в новый MemoryStream; но он бросил. Наконец, я попытался использовать PushStreamContent. Здесь мой код:
public HttpResponseMessage Get(string imageIDsList) {
var imageIDs = imageIDsList.Split(',').Select(_ => int.Parse(_));
var any = _dataContext.DeepZoomImages.Select(_ => _.ImageID).Where(_ => imageIDs.Contains(_)).Any();
if (!any) {
throw new HttpResponseException(new HttpResponseMessage(HttpStatusCode.NotFound));
}
var dzImages = _dataContext.DeepZoomImages.Where(_ => imageIDs.Contains(_.ImageID));
using (var zipFile = new ZipFile()) {
foreach (var dzImage in dzImages) {
var bitmap = GetFullSizeBitmap(dzImage);
var memoryStream = new MemoryStream();
bitmap.Save(memoryStream, ImageFormat.Jpeg);
var fileName = string.Format("{0}.jpg", dzImage.ImageName);
zipFile.AddEntry(fileName, memoryStream);
}
var response = new HttpResponseMessage(HttpStatusCode.OK);
var memStream = new MemoryStream();
zipFile.Save(memStream); //Null Reference Exception
response.Content = new ByteArrayContent(memStream.ToArray());
response.Content.Headers.ContentType = new MediaTypeHeaderValue("application/zip");
response.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment") { FileName = string.Format("{0}_images.zip", dzImages.Count()) };
return response;
}
}
zipFile.Save(memStream) генерирует нулевую ссылку. Но ни zipFile, ни memStream не являются нулевыми, и нет внутреннего исключения. Поэтому я не уверен, что вызывает нулевую ссылку. У меня очень мало опыта работы с Web API, потоками памяти, и я никогда раньше не использовал DotNetZipLibrary. Это зависит от этого вопроса: Хотите эффективный контроллер веб-API ASP.NET, который может надежно вернуть от 30 до 50 ~ 3 МБ JPEG
Любые идеи? спасибо!