Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/286.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/34.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 我的Silverlight应用程序无法使用webclient方法_C#_Asp.net_Silverlight_Webclient - Fatal编程技术网

C# 我的Silverlight应用程序无法使用webclient方法

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”类

尝试在C#中执行基本webclient数据拉取,visualstudio中没有这些方法,代码也未编译

        //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中看到的几个方法相匹配-有一些定义异步回调的概念。啊-多痛苦啊。。。(谢谢)