C# 我的Silverlight应用程序无法使用webclient方法
尝试在C#中执行基本webclient数据拉取,visualstudio中没有这些方法,代码也未编译C# 我的Silverlight应用程序无法使用webclient方法,c#,asp.net,silverlight,webclient,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”类
//snip
WebClient client = new WebClient();
byte[] resp = client.DownloadData(url);
//snip
错误1“System.Net.WebClient”不包含“DownloadData”的定义,并且找不到接受“System.Net.WebClient”类型的第一个参数的扩展方法“DownloadData”(是否缺少using指令或程序集引用?)C:\Users\Michael\Documents\Visual Studio 2008\Projects\search2\search2\MainPage.xaml.cs
我在一个XAML/Silverlight项目的c#文件中这样做,但无法想象这会有什么不同。我在网上找不到任何关于这个问题的参考资料,上个月我也做了类似的工作,但是在一个普通的ASP.NET页面上,而不是在Silverlight应用程序中 Silverlight有一个精简版的.NET Framework。与完整.NET框架中的对应方法相比,它的方法非常少。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));
如果需要传输二进制数据,则可能必须显式使用。通过使用WebClient.OpenReadCompleted和OpenReadAsync,您可以在Silverlight中实现所需的最佳功能。这将返回一个流。您可以直接使用它,或者将流复制到一个字节[],如下所述,例如: 另外,请注意Silverlight的WebClient功能不是.NET的子集。如果它是一个子集,那么它们都做的事情,它们也会做同样的事情。但事实并非如此。例如,SL4的OpenReadAsync实际上是异步的。它根本不会阻止调用线程。然而,在.NET4中,OpenReadAsync和DownloadDataAsync确实会部分阻止调用线程,并且在调试器中运行时会更严重地阻止调用线程。要在.NET4中获得真正的非UI阻塞效果,您需要自己在单独的线程中运行下载。此外,在Silverlight中,DownloadProgressUpdate在整个OpenReadAsync下载过程中都能很好地运行。在.NET中,它没有。但是.NET的DownloadDataAsync确实以与Silverlight的OpenReadAsync非常相似的方式启动DownloadProgressUpdate 因此,如果希望在WPF和Silverlight项目之间实现一致性,可以直接在SL端使用OpenReadAsync。在WPF端,在单独的线程中启动DownloadDataAsync:
Thread downloadThread = new Thread(new ThreadStart(() => wc.DownloadDataAsync(uri)));
downloadThread.Start();
然后在DownloadDataCompleted中,从返回的字节[]创建一个MemoryStream,如果您希望它是流形式的话。(我没有发现额外的开销会显著影响性能。)Silverlight不支持整个.NET框架。查看MSDN。我没有发现任何明确告诉我哪些内容不受支持的内容。WebClient的东西似乎对于Silverlight这样的前端RIA技术来说是相当基本的,不是吗?谢谢你的回答…:/感谢Rex的发现,当时我没有耐心这么做。感谢你们两位:)我刚刚发现:这似乎与我在intellisense中看到的几个方法相匹配-有一些定义异步回调的概念。啊-多痛苦啊。。。(谢谢)