Вызов WebClient внутри WebService - PullRequest
0 голосов
/ 29 марта 2010

Я начал разрабатывать приложение в 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 Ответ

1 голос
/ 29 марта 2010

Вы можете достичь своей цели, внедрив дуплексную службу. На сайте msdn есть полезная информация и замечательная запись подкаста Майка Таулти. В общем случае вам придется изменить договор на эксплуатацию, разделив его на две части. Первая часть будет инициировать загрузку вашего WebClient на сервер. Затем на сервере, после загрузки html, сервер отзовет контракт, реализованный на стороне клиента, с полезной нагрузкой, состоящей из необходимого html-содержимого.

...