我开始在Silverlight中开发一个应用程序,用于下载网站的HTML然后解析它。使用Silverlight 4,只需要提升权限即可轻松实现。但是,使用Silverlight 3,获取网站HTML的唯一方法是通过WebService调用。我最初的想法是做以下事情:
public class Service1
{
[OperationContract]
public void GetHtml()
{
Uri targetUri = new Uri("http://www.google.com", UriKind.RelativeOrAbsolute);
WebClient webClient = new WebClient();
webClient.DownloadStringCompleted += this.WebClient_DownloadStringCompleted;
webClient.DownloadStringAsync(targetUri);
}
private void WebClient_DownloadStringCompleted(object sender, DownloadStringCompletedEventArgs e)
{
}
}
但是,我意识到,只要我从Silverlight应用程序拨打电话,这也是异步,我就无法检索网站的HTML。这就是我改为以下内容的原因:
public class Service1
{
[OperationContract]
public string GetHtml()
{
Uri targetUri = new Uri("http://www.google.com", UriKind.RelativeOrAbsolute);
WebClient webClient = new WebClient();
return webClient.DownloadString(targetUri);
}
}
我相信最后一种方法并不是那么好,因为它会冻结线程。所以,我的问题,是否有办法实现第一种方法 a.k.a.从异步调用中进行异步调用:)。任何帮助将不胜感激。
最诚挚的问候, 基里尔
答案 0 :(得分:1)
您可以通过实施双工服务来实现目标。 msdn site上有一些有用的信息,Mike Taulty有一些精彩的podcast entry信息。通常,您必须通过将操作合同分为两部分来修改操作合同。第一部分将在服务器上启动WebClient下载。然后,在服务器上,在下载html之后,服务器将回调在客户端实现的合同,其中包含由所需html内容组成的有效负载。