2008-09-30 178 views
1

可能是一個簡單的解決方案的長問題,但這裏有...如何在客戶端知道HTTP處理程序何時完成處理?

我有一個自定義的silverlight控件,用於選擇多個文件並將它們發送到服務器。它使用WebCLient控件的OpenWriteAsync方法將文件發送到常規處理程序(FileReciever.ashx)。

基本上,Silverlight的代碼做這樣的每個文件:

WebClient client = new WebClient(); 
client.OpenWriteCompleted += (sender, e) => 
    { 
    PushData(data, e.Result); 
    e.Result.Close(); 
    data.Close(); 
    }; 
client.OpenWriteAsync(handlerUri); 

服務器側處理程序僅讀取輸入流,然後做一些更多的處理與所得到的字節數組。

問題是客戶端OpenWriteCompleted是在所有數據通過線路發送後立即完成的。然後我的代碼將繼續使用下一個文件。我真正想要的是等到ASHX處理程序完成它的所有處理請求。我怎麼做? WebClient上的任何等待機制?我可以在處理程序中的HttpContext上做任何回調?我應該使用其他類型的轉移技術嗎?請指教!

回答

0

Hrm,也許一個簡單的解決方案可能是用GUID來標記url(每個文件的guid都是唯一的,或者轉移,對你的狀態有意義的任何東西)。然後,您可以擁有另一個簡單的Web服務,該服務能夠基於guid檢查其他服務的狀態,並讓您的Silverlight客戶端爲其處理狀態查詢該新服務(通過將新Web服務傳遞給過去的轉移)。

+0

像這樣的東西可能會工作 - 但我希望有另一種方式,內置的東西,不涉及像這樣的單獨的服務。 – 2008-09-30 11:28:05

0

我假設您擔心從處理程序返回的數據需要很長時間才能傳輸,並且服務器在此期間未被使用。沒有辦法告訴服務器何時完成處理,所以我不認爲你可以在不改變你的架構的情況下做到這一點。

我會讓你的處理程序只有一些標識符(如一個GUID或int),可以用來檢索另一個請求中的處理程序的結果。因此,頁面會調用處理程序,處理程序會存儲結果並返回標識符,頁面會第二次調用處理程序,並調用另一個處理程序來獲取第一個調用的結果。這會在您的數據傳輸過程中保持您的服務器在使用中。

+0

我擔心服務器端處理會佔用大量資源,因此如果服務器完全處理(不僅僅是接收到)文件編號1,我不想發送第二個文件。然而,你的答案與mattlant的基本相同,所以猜測這就是我必須去的方式。 – 2008-09-30 11:34:50

0

或者你也可以用JavaScript(jQuery)來做...如果你不介意使用JavaScript。

0

如果文件不是很大,並且可以將每個文件保存在內存中,那麼一個醜陋而有效的解決方案是將它們轉換爲字符串並使用UploadStringAsync方法發送它們。

如果文件大小是無界限的,請避免使用這種方法,但如果現在可以確定文件大小相對較小,則可以使用此方法。

1

在Silverlight forums中提出了同樣的問題。微軟認可的答案是,你不能用WebClient和OpenWriteAsync做到這一點。您需要使用UploadStringAsync或HttpWebRequest。

相關問題