2011-05-11 44 views
2

我使用WebClient的對象下載(從服務器到客戶端)的文件獲取文件大小:在Silverlight 4

WebClient wc = new WebClient(); 
wc.OpenReadCompleted += Load_TransferCompleted; 
wc.OpenReadAsync(uriAddress, Filename); 

我想之前知道文件大小開始下載操作。有沒有辦法在SL4中做到這一點?

感謝您的幫助。

吉拉德。

+0

如果我們知道您爲什麼想在下載前知道尺寸,這可能會有幫助嗎? – AnthonyWJones 2011-05-11 12:05:07

+0

我有多個文件(可以說10),一個接一個地下載。我想顯示一個進度條並估計完整(對於所有文件)下載操作持續時間。這些文件的大小不一樣。 – Gilad 2011-05-11 15:22:38

+0

文件大小有多大?爲什麼不顯示迄今爲止下載的文件數量? – AnthonyWJones 2011-05-12 12:25:37

回答

1

下面是一些空氣代碼你一起玩(我還沒有測試它自己)

WebRequest req = WebRequestCreator.ClientHttp.Create(yourUri); 
req.Method = "HEAD"; 
req.BeginGetResponse(ar => 
{ 
    WebResponse resp = req.EndGetResponse(ar); 
    int length = resp.ContentLength; 

    // Do stuff with length 
}, null); 

通過使用ClientHttp堆棧可以使用「HEAD」請求將返回同一組頭作爲「GET」而不是實際的實體。

雖然至少有一點需要注意,但是請求中不會發送uri的現有cookie。如果響應對Cookie很敏感(例如因爲它需要會話ID),那麼事情會變得更加複雜。

+0

此代碼在\t處引發安全性錯誤\t \t \t WebResponse resp = req.EndGetResponse(ar); 。有小費嗎? – 2014-01-06 05:03:17

0

我認爲使這成爲可能的唯一方法是發佈大小。它可以被編碼,但也可以通過網絡服務獲得。

+0

我很害怕這個,Webservice不是一個選項,手動添加文件大小作爲參數在項目中是相當麻煩的。 – Gilad 2011-05-11 11:21:10

+0

從某種角度來看,服務器端的東西不是(很容易)可用於客戶端是件好事。您可以將大小添加到Silverlight應用程序所在的頁面嗎?它甚至可能是一個隱藏的輸入。在Silverlight中,您可以使用HTML橋接來獲取隱藏輸入並讀取值。這是一個可怕的黑客,但可以完成。 – 2011-05-11 11:27:04

+0

我已經將大小添加到HTML頁面。這樣做的問題是每次更改文件時都必須手動更新大小。我正在考慮一個更輕鬆的解決方案。 – Gilad 2011-05-11 16:11:02