在WebService中调用WebClient

时间:2010-03-29 07:34:47

标签: wcf silverlight service webclient

我开始在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.从异步调用中进行异步调用:)。任何帮助将不胜感激。

最诚挚的问候, 基里尔

1 个答案:

答案 0 :(得分:1)

您可以通过实施双工服务来实现目标。 msdn site上有一些有用的信息,Mike Taulty有一些精彩的podcast entry信息。通常,您必须通过将操作合同分为两部分来修改操作合同。第一部分将在服务器上启动WebClient下载。然后,在服务器上,在下载html之后,服务器将回调在客户端实现的合同,其中包含由所需html内容组成的有效负载。