从Azure Blob C#下载批量映像 - 请求超时问题

时间:2016-12-28 03:17:14

标签: c# asp.net-mvc azure azure-storage-blobs azure-web-app-service

我们将文件存储到Azure blob中,我们为用户提供了从我们的网站下载zip格式的多个文件(可以是500-1000个文件)的选项。我们已经放置了一个代码但是它需要更长的时间来执行,因为我们在Azure Web应用程序上托管了我们的网站,它的请求超时了500。有人可以帮我们展示我们如何改进并使其更快?

请找到我们所做的代码。

string[] pods;
                            string fileName = "";
                            try
                            {
                                System.IO.Directory.CreateDirectory(path);
                                foreach (var item in objData)
                                {
                                    pods = item.POD.Split(new string[] { "," }, StringSplitOptions.None);
                                    foreach (var itemPOD in pods)
                                    {
                                        string[] data = itemPOD.Split(new string[] { "/" }, StringSplitOptions.None);
                                        fileName = System.IO.Path.Combine(path, DateTime.Now.ToString("dd_MM_yyyy") + "_" + data[data.Length - 1]);
                                        try
                                        {
                                            var stream = new WebClient().OpenRead(itemPOD);
                                            using (System.Drawing.Image img = System.Drawing.Image.FromStream(stream))
                                            {
                                                img.Save(fileName, System.Drawing.Imaging.ImageFormat.Jpeg);
                                                GC.Collect();
                                            }
                                        }
                                        catch (Exception)
                                        {

                                        }
                                    }
                                }
                                FileDownloads objFileDownload = new FileDownloads();
                                var filesCol = objFileDownload.GetFile(path);
                                using (var memoryStream = new MemoryStream())
                                {
                                    using (var ziparchive = new ZipArchive(memoryStream, ZipArchiveMode.Create, true))
                                    {
                                        for (int i = 0; i < filesCol.Count; i++)
                                        {
                                            ziparchive.CreateEntryFromFile(filesCol[i].FilePath, filesCol[i].FileName);
                                        }
                                    }
                                    return File(memoryStream.ToArray(), "application/zip", "Attachments.zip");
                                }
                            }
                            catch (Exception)
                            {

                            }

1 个答案:

答案 0 :(得分:0)

  

我们将文件存储到Azure blob中,我们为用户提供了从我们的网站下载zip格式的多个文件(可以是500-1000个文件)的选项。我们已经放置了一个代码但是它需要更长的时间来执行,因为我们在Azure Web应用程序上托管了我们的网站,它的请求超时了500。

看来你在Gaurav Mantri和Peter Bons的帮助下得到了解决方案。在后台线程中运行长时间运行的任务比在控制器操作代码中执行它更好。根据您的描述,您在Azure网站上托管应用程序,Azure WebJob是运行任务以压缩多个文件的不错选择。此外,如果您想通过Signalr向客户端发送通知,您可能需要map users to their connections并保留有关user&amp; connectionid&amp; zipfile的信息,然后您可以从WebJob调用Signalr hub方法将通知推送到特定用户让他知道zip文件已准备就绪。

以下链接讨论了“从Azure WebJob与SignalR的网站进行通信”,这将有所帮助。

  1. Communicate from an Azure WebJob to your website with SignalR
  2. Communication between a WebJob and SignalR Hub