0

Azure BLOBにファイルを保存しています.Zip形式で複数のファイルをダウンロードするオプションを提供しています(500-1000ファイル)。 。私たちはコードを書いていますが、実行に時間がかかり、Azure WebアプリケーションでホストされているWebサイトでは500リクエストタイムアウトになっています。ある人が、私たちがどのように改善し、より速くできるかを示すのに役立つことができますか?Azure Blob C#からバルクイメージをダウンロードしてください。

私たちが行ったコードを見つけてください。

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) 
          { 

          } 
+2

代わりのウェブアプリでそれをやって、あなたは、いくつかのバックグラウンドプロセスでそれを行うことはできませんか? –

+1

これは実際にバックグラウンドプロセスを使用して実行する必要があります。また、ダウンロードを並列化してみませんか?また、OpenReadのasyncメソッドを使用してください。https://msdn.microsoft.com/en-us/library/system.net.webclient.openreadasync(v=vs.110).aspxを参照してください。 'HttpClient'に切り替えると' async'を 'await'と一緒に使うことができます。たとえば、GetStreamAsncメソッドを使用します。https://msdn.microsoft.com/en-us/library/hh551738(v=vs.118).aspx。 –

+0

はい私は同じプロセスをバックグラウンドプロセスで動かすことを考えていましたが、zipファイルのダウンロード準備が整ったらリアルタイムで通知してください。 – Chidrup

答えて

0

私たちは、Azureのブロブに私たちのファイルを格納している、私たちは私たちのウェブサイトから(500-1000ファイル可能)zip形式で複数のファイルをダウンロードするには、当社のユーザーに選択肢を与えています。私たちはコードを書いていますが、実行に時間がかかり、Azure WebアプリケーションでホストされているWebサイトでは500リクエストタイムアウトになっています。

あなたはGaurav MantriとPeter Bonsの助けを借りて解決策を得ているようです。バックグラウンドスレッドで長時間実行しているタスクを実行する方が、コントローラのアクションコードで実行するよりも優れています。あなたの説明によると、AzureのWebサイトには、Azure WebJobというアプリケーションをホストすると、複数のファイルを圧縮するというあなたのタスクを実行するのに適しています。また、Signalrを使用してクライアントに通知する場合は、map users to their connectionsとし、ユーザー&のconnectionid & zipfileに関する情報を保持し、WebjobからSignalr hubメソッドを呼び出して特定のユーザーにプッシュ通知することができます。彼はzipファイルが準備ができていることを知っています。

次のリンクは、「Azure WebJobからSignalRを使用したWebサイトへの通信」について説明しました。

  1. Communicate from an Azure WebJob to your website with SignalR
  2. Communication between a WebJob and SignalR Hub
関連する問題