2017-02-06 301 views
0

我有一個頁面,我正在建立一個文件夾中的大量文件。完成後,我會壓縮文件夾並向客戶端下載鏈接。我將文件列表保存在數據庫中,處理1個文件,在數據庫中標記該條目,然後將Response.Redirect標記回同一頁面。然後它會讀取下一個數據庫條目並執行相同的操作,直到所有條目完成。如何修復Response.Redirect循環最終導致頁面超時?

我的頁面超時,我想要添加一些代碼來告訴它不要超時或者使用javascript重定向。我寧願不必每次都將頁面呈現給客戶端。

我已經嘗試在頁面init類中設置超時。 Server.ScriptTimeout = 60 * 60 * 60

這沒有幫助。

+0

你爲什麼要重新 - 導向,而不是做這種異步?你可以在文件夾右邊有一個javascript函數循環?然後讓它做一個Ajax調用。並更新頁面上的結果? – Puzzle84

+0

我正在使用ExportToExcel()的telerik服務器代碼調用 – Doug

回答

0

就像我在上面的評論中所說的那樣,我會採用異步方法。 重定向似乎是一個可怕的想法,它會阻止你的用戶界面。

的JavaScript僞代碼ISH:

$(folders).forEach(function(folder) { 
    var jqxhr = $.post("example.php", function(data) { 
     $("#idofyourdownloadlink").text("Processing"); 
    }) 
    .done(function(data) { 
     $("#idofyourdownloadlink").append("<a href="+data+">Download</a>"); 
    }) 
    .fail(function() { 
     $("#idofyourdownloadlink").text("Failed to process"); 
    }) 
}); 

你可以重新編寫代碼在while循環運行,您的要求做超時,如果你的服務器超載了。

在C#中做你的處理並返回鏈接。不要使用新數據重定向。

0

你可以爲每個文件夾的一個承諾,那麼當所有的承諾都完成後,即可開始上市,你網頁上的鏈接,它是這樣的:

var foldersArray = ['folder1', 'folder2']; 
var promisesList = []; 

function addFolderToDatabase(file) { 
    return new Promise(function (resolve, reject) { 
     $.post("index.php",{"file":file}) 
      .done(function(response) { 
       resolve(response); 
      }) 
      .fail(function(err) { 
       reject(err); 
      }) 
    }); 
} 


$(foldersArray).each(function(){ 
    var returnedPromise = addFolderToDatabase(this); 
    promisesList.push(returnedPromise); 
}); 


Promise.all(promisesList).then(function(){ 
    // DO WHAT YOU WANNA DO 
    // THIS CALL BACK FUNCTION MEANS THAT ALL FOLDERS ARE COMPLETED 
}); 

CHEERS,