2010-05-03 4 views
5

J'essaie d'obtenir le contenu html d'une page en utilisant Silverlight. Les classes de réponse Web et de requête ne fonctionnent pas dans Silverlight. J'ai fait quelques recherches sur Google et j'ai trouvé quelque chose. Voici ce que j'ai essayé:obtenir le contenu html d'une page avec Silverlight

public partial class MainPage : UserControl 
{ 
    string result; 
    WebClient client; 

    public MainPage() 
    { 
    InitializeComponent(); 
    this.result = string.Empty; 
    this.client = new WebClient(); 
    this.client.DownloadStringCompleted += ClientDownloadStringCompleted; 
    } 

    private void btn1_Click(object sender, RoutedEventArgs e) 
    { 
    string url = "http://www.nu.nl/feeds/rss/algemeen.rss"; 

    this.client.DownloadStringAsync(new Uri(url, UriKind.Absolute)); 

    if (this.result != string.Empty && this.result != null) 
    { 
    this.txbSummery.Text = this.result; 
    } 
    } 

    private void ClientDownloadStringCompleted(object sender, DownloadStringCompletedEventArgs e) 
    { 
    this.result = e.Result; 
    //handle the response. 
    } 
} 

Il me donne une erreur d'exécution après avoir appuyé sur le bouton:

Erreur d'exécution Microsoft JScript: Unhandled erreur dans application Silverlight Une exception est survenue lors de l'opération, ce qui rend le résultat non valide. Vérifiez InnerException pour les détails de l'exception. à System.ComponentModel.AsyncCompletedEventArgs.RaiseExceptionIfNecessary() à System.Net.DownloadStringCompletedEventArgs.get_Result() à JWTG.MainPage.ClientDownloadStringCompleted (de l'expéditeur de l'objet, DownloadStringCompletedEventArgs e) à System.Net.WebClient.OnDownloadStringCompleted (DownloadStringCompletedEventArgs e) à System.Net.WebClient.DownloadStringOperationCompleted (Object arg)

J'ai essayé de nombreuses choses, mais tout a échoué.

Que manque-t-il? Ou est-ce que quelqu'un sait comment je pourrais réaliser ceci d'une manière différente?

Merci d'avance!

+0

Vous obtenez une erreur JScript. Votre code posté n'a rien à voir avec l'erreur. J'ai juste essayé votre extrait, et cela fonctionne. BTW: vous devez déplacer this.txbSummery.Text = this.result; 'dans votre méthode' ClientDownloadStringCompleted'. Actuellement, vous essayez de placer le texte dans la zone de texte avant de le télécharger. Cela ne marche évidemment pas. –

+0

Jetez un oeil à: http://forums.silverlight.net/forums/t/54721.aspx peut-être que cela vous aide. Le problème peut être un fichier 'web.config' mal configuré. –

Répondre

1

Ceci est lié à clientaccesspolicy.xml. Lire la suite ici: http://msdn.microsoft.com/en-us/library/cc645032(VS.95).aspx

"If the connection request was from a WebClient or an HTTP class to a cross-domain site, the Silverlight runtime tries to download the security policy file using the HTTP protocol. The Silverlight runtime first tries to download a Silverlight policy file with a name of "clientaccesspolicy.xml" at the root of the requested target domain using the HTTP protocol.

If the "clientaccesspolicy.xml" is either not found (the web request returns a 404 status code), returned with an unexpected mime-type, is not valid XML, or has an invalid root node, then the Silverlight runtime will issue a request for a for the Flash policy file with a name of "crossdomain.xml" at the root of the requested target domain, using the HTTP protocol.

HTTP redirects for the policy file are not allowed. A redirect for a policy file will result in a SecurityException of access denied."

+0

Salut, Je l'ai compris. Le site Web auquel j'essayais d'accéder avec Silverlight n'a pas le fichier de politique. Merci quand même! – Yustme

0

Dans cette ligne

this.client.DownloadStringAsync(new Uri(url, UriKind.Absolute)); 

vous déclarez télécharger dans un thread asynchrone d'arrière-plan. Et dans la ligne suivante, vous pensez en quelque sorte que c'est déjà terminé?

Si vous n'avez aucune connaissance à propos de Threading, essayez d'abord avec DownloadString. Alors votre code fonctionnera.

+0

Salut, J'ai essayé de mettre cette 'ligne suivante' dans le rappel de téléchargement, mais cela n'a pas corrigé l'erreur d'exécution. Où puis-je trouver cette 'ligne de téléchargement'? A quelle classe appartient-il? – Yustme

+0

@Foxfire: vous ne voulez pas vraiment faire un appel bloquant pour récupérer une page web, n'est-ce pas? Yustme devrait simplement utiliser 'DownloadStringAsync', mais mettre la logique de gestion des données retournées dans la méthode' ClientDownloadStringCompleted'. –

+0

@Yustme: Vous ne pouvez pas mettre la chose par la suite dans l'événement, car elle sera appelée à partir d'un autre thread. – Foxfire

1

Essayez celui-ci, au lieu de vos méthodes btn1_Click et ClientDownloadStringCompleted. Il appelle le thread graphique après le chargement du flux pour mettre à jour la zone de texte. S'il échoue en raison d'une erreur sur le réseau, il décompresse l'exception (contenue en tant qu'exception interne dans un TargetInvocationException) et renvoie l'exception interne.

private void btn1_Click(object sender, RoutedEventArgs e) 
{ 
    string url = "http://www.nu.nl/feeds/rss/algemeen.rss"; 

    this.client.DownloadStringAsync(new Uri(url)); 
} 

private void ClientDownloadStringCompleted(object sender, 
         DownloadStringCompletedEventArgs e) 
{ 
    try 
    { 
     Dispatcher.BeginInvoke(() => this.txbSummery.Text = e.Result ?? ""); 
    } 
    catch (TargetInvocationException tiex) 
    { 
     throw tiex.InnerException; 
    } 
} 

Si l'erreur à nouveau occures (je suppose que cela se produira), s'il vous plaît poster un message stacktrace et erreur ici.

+0

Salut, D'une certaine façon je négligé ce poste: o Voici ce que je reçois. throw new Error ("Unhandled erreur dans application Silverlight Une exception est survenue lors de l'opération, ce qui rend le résultat non valide Vérifiez InnerException pour plus de détails d'exception. à System.ComponentModel.AsyncCompletedEventArgs.RaiseExceptionIfNecessary() \ n à System.Net.DownloadStringCompletedEventArgs.get_Result() \ n à JWTG.MainPage. <> c__DisplayClass2. b__0() "); il n'y a pas de stacktrace – Yustme

+0

Damn qui est à nouveau encadré dans une exception. Alors pourriez-vous jeter un coup d'œil à l'exception innerException? Utilisez soit le débogueur, soit remplacez simplement «throw tie.InnerException;» par «throw tie.Exception.InnerException;» –

+0

Il n'obtient jamais si loin, il s'arrête à Dispatcher.BeginInvoke (() => this.txbSummery.Text = e .Résultat ?? ""); mais voir mon poste sous celui-ci pour plus d'infos – Yustme

1

Vous essayez

private void btn1_Click(object sender, RoutedEventArgs e) 
    { 
     string url = "http://www.nu.nl/feeds/rss/algemeen.rss"; 

     this.client.DownloadStringAsync(new Uri(url, UriKind.Absolute)); 

    } 

    private void ClientDownloadStringCompleted(object sender, DownloadStringCompletedEventArgs e) 
    { 
     Stream s = e.Result; 
     StreamReader strReader = new StreamReader(s); 
     string webContent = strReader.ReadToEnd(); 
     s.Close(); 
     this.txbSummery.Text =webContent; 

    } 
Questions connexes