2010-02-22 3 views
4

Попытка сделать базовые данные веб-клиента на C#, а методы недоступны в 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 был довольно базовым для интерфейсного RIA-технологии, такого как Silverlight, нет? Спасибо за ответ ...:/ – mgkimsal

+0

Благодаря Rex для поиска 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

Вы можете наилучшим образом достичь того, чего хотите в Silverlight, используя WebClient.OpenReadCompleted и OpenReadAsync. Это вернет поток. Вы можете использовать это напрямую или скопировать поток в байт [], как описано здесь, например: http://www.yoda.arachsys.com/csharp/readbinary.html

Также будьте уверены, что функциональность Silverlight для WebClient НЕ является подмножеством .NET. Если бы это было подмножество, то то, что они оба делали, они сделали бы то же самое. Но это не так. Например, OpenReadAsync SL4 действительно асинхронен. Он вообще не блокирует вызывающий поток. Однако в .NET4 OpenReadAsync и DownloadDataAsync частично блокируют вызывающий поток и блокируют его во время работы в отладчике. Чтобы получить действительно не-UI-блокирующий эффект в .NET4, вам нужно запустить загрузку в отдельном потоке самостоятельно. Кроме того, в Silverlight, DownloadProgressUpdated прекрасно работает во время загрузки для OpenReadAsync. В .NET это не так. Однако .NET DownloadDataAsync запускает DownloadProgressUpdated аналогичным образом с OpenReadAsync от Silverlight.

Итак, если вы хотите добиться согласованности между проектом WPF и Silverlight, вы можете использовать OpenReadAsync непосредственно со стороны SL. На стороне WPF, выстрелить DownloadDataAsync в отдельном потоке:

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

Затем в DownloadDataCompleted, создать MemoryStream из возвращенных байт [], если вы хотели бы иметь его в виде потока. (Я не нашел дополнительных накладных расходов, чтобы существенно повлиять на производительность.)