【发布时间】:2016-12-28 03:17:13
【问题描述】:
我们将文件存储到 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)
{
}
【问题讨论】:
-
不能在web app里做,不能在一些后台进程里做吗?
-
这确实应该使用后台进程来完成。另外,你为什么不并行下载呢?并使用
OpenRead的异步方法,见msdn.microsoft.com/en-us/library/…。如果您切换到HttpClient,您可以使用async和await。例如使用方法GetStreamAsnc:msdn.microsoft.com/en-us/library/hh551738(v=vs.118).aspx。 -
是的,我也想在后台进程中移动它,但是一旦 zip 文件准备好下载,用户应该会收到实时通知,所以 signalR 可能会出现。
标签: c# asp.net-mvc azure azure-blob-storage azure-web-app-service