2008-09-25 46 views
6

我有一個ASP.NET Web服務,它可以完成一些繁重的工作,比如說,一些文件操作,或者從一堆水晶報表生成Excel表格。我不想被調用這個Web服務阻塞,所以我想讓Web服務調用異步。另外,我想從一個網頁調用這個Web服務,並希望有一些機制可以讓我繼續輪詢服務器,這樣我就可以在屏幕上顯示一些進度指標,比如說,已經被處理。請注意,我不希望通知完成Web方法調用,而是希望獲得實時進度狀態。我如何去做呢?您如何衡量Web服務調用的進度?

+1

而且我們都在想,「爲什麼不Web服務自動做到這一點?」當我們說他們吸吮時,這就是我們的意思。你必須自己構建所有這些東西。 – 2009-01-07 13:49:35

回答

4

寫沿多遠,你可以通過傳遞已定並返回0-100之間的近似值作業的ID查詢服務器上的一個單獨的方法(或0.0和1.0,或其他)是。

E.g.在REST風格中,您可以向http://yourserver.com/app/jobstatus/4133/發出GET請求,該請求會返回一個簡單的'52',如text/plain。那麼你只需要查詢每一秒(秒?兩秒?十秒?),看看它有多遠。

你實際上如何實現在後臺監視巨大取決於你的過程和它是如何工作。

1

擁有初始「開始生成報告」 Web服務調用創建一些任務池任務,並返回調用者的任務的ID。

然後提供返回給定的TaskID「完成百分比」的另一種方法。

提供用於返回已完成任務的實際結果的第三種方法。

1

最簡單的方法就是讓Web服務與呼叫進展的數據庫更新字段,然後創建一個查詢,即場和返回值的Web服務。

+0

如果您使用數據庫,建立一個內存表是一個不錯的主意。沒有意義的浪費磁盤I/O瑣碎的任務。 – 2008-09-25 19:37:23

0

使Web服務返回某種類型的任務ID或會話ID。製作另一種Web方法以使用該ID進行查詢,該方法返回所需的信息(完成百分比,文件列表等等)。從客戶端以一定的時間間隔輪詢此方法。

如果您在Web服務的內存中執行此操作,則使用數據庫來存儲進程信息,但這種情況在Web場環境中無法很好地擴展,因爲可能會發生該任務在另一臺服務器上運行,投票。

編輯:我剛看到另一個類似的答案,並對它發表評論。評論者是正確的 - 你可以使用內存表來避免磁盤操作,但仍然使用單獨的數據庫服務器。

2

我認爲XML的Web服務是緩慢的,因此創建多種方法和輪詢的進展將是極其緩慢,將在服務器上產生巨大的負荷。我不會在生產環境中這樣做。我看到與數據庫輪詢相同(但較小)的問題。

嘗試代替SOAP擴展。它實現了一個事件驅動模型。見Adding a Progress Bar to Your Web Service Client Application on MSDN

2

您也可以use SoapExtensions向您的客戶通知下載/處理進度。服務器然後可以發送事件給客戶端。如果您不使用它,客戶端中的任何內容都不得更改。

允許在你的客戶是這樣的:

//... 
private localhost.MyWebServiceService _myWebService = new localhost.MyWebServiceService(); 
_myWebService.processDelegate += ProgressUpdate; 
_myWebService.CallHeavyMethod(); 
//... 

private void ProgressUpdate(object sender, ProgressEventArgs e) 
{ 
    double progress = ((double)e.ProcessedSize/(double)e.TotalSize) * 100.00; 
    //Show Progress... 
}