webclient方法不适用于我的Silverlight应用程序

时间:2010-02-22 03:09:32

标签: c# asp.net silverlight webclient

尝试在C#中执行基本的webclient数据,并且这些方法在visualstudio中不可用,并且代码没有编译。

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

错误1'System.Net.WebClient'不包含'DownloadData'的定义,也没有找到接受类型'System.Net.WebClient'的第一个参数的扩展方法'DownloadData'(你是否错过了使用指令或程序集引用?)C:\ Users \ Michael \ Documents \ Visual Studio 2008 \ Projects \ search2 \ search2 \ MainPage.xaml.cs

我在一个C#文件中为XAML / Silverlight项目执行此操作,但无法想象为什么会产生影响。我在网上找不到这个问题的任何参考,上个月我有类似的工作,但是在常规的ASP.NET页面中,而不是在Silverlight应用程序中。

3 个答案:

答案 0 :(得分:4)

Silverlight只有完整.NET的一部分功能。更值得注意的是,它不包含用于与Web服务通信的阻止方法。这使程序员的生活变得有点困难,但对于用户来说这是一件很棒的事情 - 你不能(轻松地)编写在服务器没有快速响应时挂起的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

答案 1 :(得分:3)

Silverlight有一个.NET Framework的精简版/紧凑版。请参阅MSDN's documentation for the WebClient in Silverlight,了解与完整.NET Framework中的对应方法相比,它的方法非常少。

答案 2 :(得分: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。 (我没有发现显着影响性能的额外开销。)