2010-02-22 54 views
4

嘗試在C#中執行基本webclient數據拉取,並且方法在visualstudio中不可用,且代碼不在編譯中。webclient方法不適用於我的Silverlight應用程序

 //snip 
     WebClient client = new WebClient(); 
     byte[] resp = client.DownloadData(url); 
     //snip 

錯誤1「System.Net.WebClient」不包含關於「DownloadData」的定義和沒有擴展方法「DownloadData」接受類型「System.Net.WebClient」的第一個參數可以發現(是您缺少使用指令或程序集引用?)C:\ Users \ Michael \ Documents \ Visual Studio 2008 \ Projects \ search2 \ search2 \ MainPage.xaml.cs

我在ac#文件中爲XAML/Silverlight項目,但無法想象爲什麼會有所作爲。我在網上找不到任何這個問題的引用,上個月我有類似的工作,但是在常規的ASP.NET頁面中,而不是在Silverlight應用程序中。

+0

Silverlight不支持整個.NET Framework。檢查MSDN。 –

+0

我沒有找到那些明確告訴我什麼不被支持的東西。WebClient的東西似乎對於像Silverlight這樣的前端RIA技術來說是相當基本的,不是嗎? 感謝您的回答...:/ – mgkimsal

+0

感謝雷克斯尋找http://msdn.microsoft.com/en-us/library/system.net.webclient%28VS.95%29.aspx,當我didn沒有耐心這樣做。 –

回答

3

Silverlight具有精簡版的.NET Framework。請參閱MSDN's documentation for the WebClient in Silverlight,以查看與完整.NET Framework中的對應方法相比,它的方法非常少。

+0

我剛剛發現這個:http://blogs.msdn.com/silverlight_sdk/archive/2008/04/01/using-webclient-and-httpwebrequest.aspx這似乎與匹配我在intellisense中看到的方法很少 - 有一些定義異步回調的概念。呃 - 多麼痛苦...(謝謝) – mgkimsal

4

Silverlight只具有完整.NET功能的一個子集。更值得注意的是,它不包含阻止與網絡服務通信的方法。這使得程序員的生活有點困難,但對用戶來說這是一件奇妙的事情 - 當服務器沒有快速響應時,您不能(輕鬆地)編寫將掛起的Silverlight應用程序。

如果能傳輸數據爲文本,您可以使用DownloadStringAsync方法:

var wc = new WebClient(); 
wc.DownloadStringCompleted += (sender, e) => { 
    string data = (string)e.Result; 
    // Process the data here 
    } 
wc.DownloadStringAsync(new Uri(address)); 

如果需要傳輸二進制數據,那麼你可能需要使用HttpWebRequest class明確。

0

通過使用WebClient.OpenReadCompleted和OpenReadAsync,您可以最好地實現Silverlight中的所需。這將返回一個流。您可以直接使用它,或者將流複製到byte []中,如下所述:http://www.yoda.arachsys.com/csharp/readbinary.html

此外,請注意,Silverlight的WebClient功能不是.NET的子集。如果它是一個子集,那麼他們都做的事情,他們會做同樣的事情。但這種情況並非如此。例如,SL4的OpenReadAsync確實是異步的。它根本不阻止調用線程。但是,在.NET4中,OpenReadAsync和DownloadDataAsync會部分阻止調用線程,並在調試器中運行時阻塞它。爲了在.NET4中獲得真正的非UI阻塞效果,您需要自己在單獨的線程中運行下載。此外,在Silverlight中,DownloadProgressUpdated在OpenReadAsync的整個下載過程中都很好地啓動。在.NET中它不。然而,.NET的DownloadDataAsync會以與Silverlight的OpenReadAsync相當的方式啓動DownloadProgressUpdated。因此,如果要實現WPF和Silverlight項目之間的一致性,則可以直接在SL側使用OpenReadAsync。在WPF的一面,把火關DownloadDataAsync在一個單獨的線程:

Thread downloadThread = new Thread(new ThreadStart(() => wc.DownloadDataAsync(uri))); 
downloadThread.Start(); 

然後在DownloadDataCompleted,從返回的byte []創建一個MemoryStream,如果你寧願有它的流形式。 (我還沒有發現額外開銷會顯着影響性能。)

相關問題