2016-11-23 4 views
0

私は、PDFレポートを作成する必要があるASP.NET MVCアプリケーションに取り組んでいます。バックエンドでのこれらのPDFレポートの生成には長い時間がかかります(30秒以上)。当社は、30秒以上かかるすべてのHTTPリクエストをタイムアウトさせるsquidというプロキシを使用しています。サーバーに作成するのに長い時間がかかるファイルをダウンロードする最良の方法

のため、リンクまたはget要求を介して直接pdfレポートを要求するとタイムアウトになります。

どうすればこの問題を回避できますか?ファイルを非同期に配信する方法はありますか?または、クライアントがファイルを要求し、定期的にサーバーをポーリングしてファイルが生成されているかどうかを確認し、準備ができたらダウンロードを再度要求するような、より精巧なプロトコルを使用する必要がありますか?

+0

ajaxは非同期です。 – madalinivascu

+0

私が知る限り、ajax経由でファイルを非同期にダウンロードすることはできません。 –

+0

あなたは私がそれを同期的に行うファイルをダウンロードすると、それはサーバーが他のユーザーにページを送信するのをブロックするということを意味するでしょうか? – madalinivascu

答えて

1

signalrのようなものを使用して、サーバーでジョブの完了をポーリングし、完了後にブラウザをリダイレクトすることができます。

ちょっとしたアイデアだけど、hangfireを使ってPDF作成をスケジュールすることができます。

0

私は、既存の質問Handle file download from ajax post

でいくつかの有用な助けがここに私がやったことだ見つけました。非同期に処理したいリンクを識別するためのajaxDownload cssクラスを作成しました。

私は、特定の場所からファイルをダウンロードするDownloadFileというサーバー上のメソッドを作成しました。

ファイルを返す元のURLを、PDFを生成するURLに置き換えてファイル名を返します。成功イベントでファイル名を渡してから、window.location.hrefを使用してファイルをダウンロードします。

$("a.ajaxDownload").on("click", "", function(e) { 
     e.preventDefault(); 
      var url = $(this).attr('href'); 
     $.ajax({ 
      type: "POST", 
      url: url, 
      error: function(res) { 
       alert("an error has occured"); 
      }, 
      success: function(res) { 
       var url2 = '/QuoteSummary/DownloadFile/?filename=' + res; 
       window.location.href = url2; 
      }}); 
    }); 
関連する問題