2013-05-15 17 views
2

我已經從一個傳統的ASP頁面調用在傳統的ASP長時間運行VB6 COM對象..超時錯誤

它完美的作品稱爲長時間運行的COM VB6對象時,沒有很多事情要做,但時間如果它必須做很多事情。

有調用它異步所以它不會超時或

可能我所說的進度條不斷刷新客戶端,以便它wouldnt超時的方法嗎?

Set objQReport = Server.CreateObject("ReportGenerator") 

mainRpt = objQReport.GenerateReport(MySessionRef) ' times out here sometimes 

Set objQReport = nothing 

任何提示將是有益的

+1

你能只是增加與Server.ScriptTimeout = X(秒)的ASP超時? – johna

回答

2

Web技術是不是真的適合長時間運行的任務,但你有幾種選擇:

一種選擇是做一個AJAX調用到第二ASP頁面。只要ASP正在運行,即使客戶端(實際調用的瀏覽器/ AJAX)不再連接,服務器也會完成該過程。

這種方法使用網絡技術來處理長期運行的任務和缺點是,你與執行此長時間運行的任務負擔你的IIS機器,少留表現爲東西IIS是好的在;爲網頁提供服務。

因此,在您的登陸頁面(比如default.asp)對您的(長時間運行的)報告頁面執行AJAX調用。如何做ajax調用取決於你使用的是什麼(如果有的話)JavaScript庫。 jQuery中它會是這樣的:

<script type="text/javascript"> 
    /* AJAX call to start the report generation */ 
    $(document).ready(function(){ 
      $.get("[URL_OF_YOUR_LONG_RUNNING_PROCESS]", function(data) 
       { 
        alert(data); 
       }); 
    }); 
    </script> 

正如你可以看到我報警是從該URL返回的任何數據,但在你的情況可能不是你想要的。您希望您的訪問者在長時間運行的過程繼續工作的同時繼續瀏覽。

這樣,URL被異步調用。服務器將開始處理URL並且瀏覽器不必等待它。服務器將繼續並在後臺完成長時間運行的任務。

請注意,您仍然需要增加運行長過程的asp頁面上的server.scripttimeout。這只是確保用戶可以繼續瀏覽,服務器仍然會遵守已配置的server.scripttimeout設置,如果時間過長,則會失敗。

廣泛使用的第二種選擇是使用消息隊列。消息隊列接受消息並保證傳遞這些消息,即使計算機或網絡出現故障。

Microsoft Windows內置MSMQ(您必須在軟件設置中啓用它),並且您可以從傳統的ASP中使用它。該隊列將存儲消息並將其發送給消費者。消費者是你需要自己寫的東西;一個可以讀取隊列並處理消息的應用程序。

你所做的是ASP向MSMQ寫入一條消息,其中包含有關要執行的任務及其參數的信息。
您的消費者應用程序必須輪詢MSMQ,閱讀消息並開始長時間運行的過程。這將完全獨立於IIS運行,甚至可以在完全不同的計算機上運行(MSMQ可以跨網絡運行)。

第二種方法的不足之處在於您必須編寫一個消費者,很可能是使用像VB或C#這樣的低級語言(儘管您可能可以使用Python),並且最好編寫它作爲服務。我不知道你在這些語言中有多麼舒服,但是如果你自己編寫了COM對象,那麼在VB6中編寫一個可執行文件來輪詢MSMQ並調用COM對象將會很簡單。 下面是一些讓你開始的鏈接。

http://support.microsoft.com/kb/173339

http://technosock.blogspot.nl/2007/07/microsoft-message-queue-from-classical.html

http://www.informit.com/articles/article.aspx?p=131272&seqNum=6

希望這有助於

埃裏克

+1

當工作到達Q時,使用MSMQ觸發器使MSMQ啓動後臺工作程序應該不成問題。如果需要,該工作人員可能甚至可能是WSH腳本。沒有必要繼續進行輪詢過程,因此無論如何,Q事件都比輪詢更好。 – Bob77

+0

感謝您的加入,Bob77。我沒有意識到這一點。我只使用MSMQ和一個輪詢服務。 –

+0

嗨,感謝提示如何在調用我的對象時使用MSMQ對象?請參閱我上面的代碼 –

相關問題