Запросы остаются в ожидании при создании 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, в то же время делая другие запросы?
заранее спасибо