【问题标题】:webclient methods not available to my Silverlight application我的 Silverlight 应用程序无法使用 webclient 方法
【发布时间】:2023-04-11 10:55:05
【问题描述】:

尝试在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

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

【问题讨论】:

  • Silverlight 不支持整个 .NET Framework。检查 MSDN。
  • 我没有找到任何明确告诉我不支持的内容。 WebClient 的东西对于像 Silverlight 这样的前端 RIA 技术来说似乎是相当基础的,不是吗?感谢您的回答...:/
  • 感谢 Rex 在我没有耐心的时候找到msdn.microsoft.com/en-us/library/…
  • 谢谢你们两个:)

标签: c# asp.net silverlight webclient


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

    【解决方案3】:

    您可以通过使用 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,如果您希望它采用流形式。 (我没有发现显着影响性能的额外开销。)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多