методы веб-клиента недоступны для моего приложения Silverlight - PullRequest
4 голосов
/ 22 февраля 2010

Попытка выполнить базовое извлечение данных веб-клиента в C #, а методы недоступны в visualstudio, и код не компилируется.

        //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

Я делаю это в файле c # для проекта XAML / Silverlight, но не могу себе представить, почему это будет иметь значение. Я не могу найти какой-либо ссылки на эту проблему в Интернете, и у меня было что-то похожее на эту работу в прошлом месяце, но на обычной странице ASP.NET, а не в приложении Silverlight.

Ответы [ 3 ]

4 голосов
/ 22 февраля 2010

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 .

3 голосов
/ 22 февраля 2010

Silverlight имеет урезанную / компактную версию .NET Framework. См. документацию MSDN для WebClient в Silverlight , чтобы увидеть, что у него очень мало методов по сравнению с его аналогом в полной .NET Framework.

0 голосов
/ 20 мая 2010

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

Кроме того, помните, что функциональность Silverlight для WebClient НЕ является подмножеством .NET. Если бы это было подмножество, то, что они оба делают, они делали бы то же самое. Но это не так. Например, OpenReadAsync в SL4 действительно является асинхронным. Он вообще не блокирует вызывающий поток. Однако в .NET4 OpenReadAsync и DownloadDataAsync частично блокируют вызывающий поток и хуже его блокируют при работе в отладчике. Чтобы получить действительно не блокирующий пользовательский интерфейс эффект в .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 из возвращенного байта [], если вы предпочитаете иметь его в виде потока. (Я не нашел дополнительных накладных расходов, которые могли бы существенно повлиять на производительность.)

...