Запросы остаются в ожидании при создании Zip в качестве загружаемого вложения браузера в IIS с использованием SharpZipLib

При создании Zip с использованием SharpZipLib из ICSharpCode в качестве приложения для загрузки браузера в IIS ( https://github.com/icsharpcode/SharpZipLib/wiki/Zip-Samples), другие запросы, которые я отправляю из браузера, остаются в ожидании, пока не будет выполнен запрос "zip". Я попробовал следующее:

  • Делаем функцию архивирования асинхронной
  • Отправка запросов от:
    • Javascript
    • <a href="action/controller" target="_blank"></a>
    • <form action="action/controller"></form>

Это код:

Внешний интерфейс:

downloadAllFiles() {
  let url = "action/controller";
  window.location.href = url;
}

Back-конец:

namespace <NAMESPACE>
{
    public static class BulkDownloader
    {
        private static byte[] buffer = new byte[1024 * 4];
        private const int LevelOfCompression = 0;

        public static async Task DownloadAsync(HttpResponseBase response, ClientContext context, HashSet<item> items)
        {
            var info = GetDataForMultiDownload(context, items);
            SetupResponseToReceiveZipFile(response, info.WebTitle);
            await MakeZipFileAsync(response, context, info);
        }

        private static async Task MakeZipFileAsync(HttpResponseBase response, ClientContext context, DownloadInfo info)
        {
            var zipOutputStream = new ZipOutputStream(response.OutputStream);
            zipOutputStream.SetLevel(LevelOfCompression);

            foreach (var fileInfo in info.FileInfos)
            {
                if (!response.IsClientConnected)
                    break;

                var fs = await GetFileStreamAsync(context, fileInfo.FileItem);

                zipOutputStream.PutNextEntry(new ZipEntry(fileInfo.FileName)
                {
                    Size = fs.Length,
                });

                var count = await fs.ReadAsync(buffer, 0, buffer.Length);
                while (count > 0)
                {
                    zipOutputStream.Write(buffer, 0, count);
                    count = await fs.ReadAsync(buffer, 0, buffer.Length);

                    if (!response.IsClientConnected)
                        break;

                    await response.FlushAsync();
                }

                fs.Close();
            }
            zipOutputStream.Close();

            response.Flush();
            response.End();
        }

        private static void SetupResponseToReceiveZipFile(HttpResponseBase response, string fileName)
        {
            response.Clear();
            response.ClearHeaders(); 

            response.ContentType = "application/octet-stream";
            response.AppendHeader("content-disposition", $"attachment; filename=\"{fileName}.zip\"");
            response.CacheControl = "Private";
            response.Cache.SetExpires(DateTime.Now.AddMinutes(3));
        }

    private static async Task<Stream> GetFileStreamAsync(ClientContext context, ListItem documentItem)
        {
            var fileStream = documentItem.File.OpenBinaryStream();

            context.Load(documentItem.File);
            await context.ExecuteQueryAsync();

            return fileStream.Value;
        }

        private static DownloadInfo GetDataForMultiDownload(ClientContext context, HashSet<item> items)
        {
            var library = context.Web.Lists.GetByTitle(Names.Title);
            context.Load(library);

            var query = new CamlQuery
            {
                ViewXml = $@"<View Scope='RecursiveAll'></View>"
            };

            var fileItems = library.GetItems(query);

            context.Load(fileItems);
            context.Load(context.Web);
            context.ExecuteQuery();

            var fileInfos = GetFileInformations(items, fileItems);

            return new DownloadInfo
            {
                WebTitle = context.Web.Title,
                FileInfos = fileInfos.ToList()
            };
        }

        private static IEnumerable<FileInfo> GetFileInformations(HashSet<item> items, ListItemCollection fileItems)
        {
            foreach (var fileItem in fileItems)
            {
                var lookupValue = (FieldLookupValue)fileItem[Names.Title];

                if (lookupValue != null && lookupValue.LookupValue != null)
                {
                    var id = lookupValue.LookupId;
                    var item = iems.Single(x => x.Id == id);
                    const string fieldname = "FileLeafRef";

                    var fileName = fileItem.GetString(fieldname);

                    yield return new FileInfo
                    {
                        FileName = Path.Combine(item.Category, item.Title, fileName),
                        FileItem = fileItem,
                    };
                }
            }
        }

        class FileInfo
        {
            public string FileName { get; set; }
            public ListItem FileItem { get; set; }
        }

        class DownloadInfo
        {
            public string WebTitle { get; set; }
            public List<FileInfo> FileInfos { get; set; }
        }
    }
}

После выбора создания zip:

Как я могу скачать файл Zip, в то же время делая другие запросы?

заранее спасибо

0 ответов

Другие вопросы по тегам