2010-03-29 12 views
0

J'ai commencé à développer une application dans Silverlight qui consistait à télécharger le code HTML d'un site Web, puis à l'analyser. Avec Silverlight 4, cela peut être réalisé facilement en demandant simplement des permissions élevées. Avec Silverlight 3, cependant, la seule façon d'obtenir le code HTML d'un site Web est via un appel WebService. Mon idée initiale était de faire ce qui suit:Appel de WebClient dans 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) 
    { 

    } 
} 

Cependant, je me suis aperçu que, dès que je fais l'appel, qui est async aussi bien, de mon application Silverlight, il n'y a aucun moyen pour moi de récupérer le code HTML du site Web. C'est pourquoi je suis passé à ce qui suit:

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); 
    } 
} 

Je crois que la dernière approche n'est pas très bonne puisqu'elle va geler le fil. Donc, ma question, est là un moyen d'atteindre la première approche a.k.a faire un appel asynchrone à partir d'un appel asynchrone :). Toute aide serait grandement appréciée.

Cordialement, Kiril

+0

Je ne suis pas sûr de comprendre le problème. La deuxième version de votre code gèlera uniquement le thread sur le serveur. Votre application cliente restera "dégelée" pendant que l'appel SL -> Service est en cours. –

+0

C'est ce que j'essaie d'éviter - le gel du serveur. Si je fais l'appel WebClient en utilisant DownloadStringAsync, le serveur ne sera pas gelé, mais comment obtenir les données retournées dans le gestionnaire d'événements DownloadStringCompleted? –

+0

Ah, désolé à ce sujet. J'ai mal compris votre question. –

Répondre

1

Vous pouvez atteindre votre objectif en implementig un service Duplex. Il y a quelques informations utiles à ce sujet sur le msdn site et un merveilleux podcast entry par Mike Taulty. En général, vous devrez modifier votre contrat d'exploitation en le divisant en deux parties. La première partie initierait votre téléchargement WebClient sur le serveur. Ensuite, sur le serveur, après que le code html a été téléchargé, le serveur rappelle un contrat qui est implémenté du côté client avec la charge utile constituée du contenu html requis.

+1

+1 pour une bonne réponse. Mais: Alors que cette solution est définitivement la voie à suivre si vous devez absolument, je me demande toujours pourquoi vous en auriez besoin. Tout serveur Web décent est parfaitement capable de gérer plusieurs demandes. Il ne sera pas "gelé" juste parce qu'il télécharge du HTML. –

+1

@Henrik. Je suis d'accord avec vous 100%. C'est juste 'si vous devez absolument'. Merci pour +1 :) – Przemek

+0

Donc vous êtes en train de dire qu'il est tout à fait normal d'utiliser la méthode DownloadString pour ce scénario. –