2010-05-03 11 views
5

Ich versuche, den HTML-Inhalt einer Seite mit Silverlight zu bekommen. Webresponse- und Anforderungsklassen funktionieren nicht in Silverlight.Get HTML-Inhalt einer Seite mit Silverlight

Ich habe etwas googeln und ich habe etwas gefunden. Das ist, was ich versucht:

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. 
    } 
} 

Es gibt mir einen Laufzeitfehler nach Drücken der Taste:

Microsoft JScript-Laufzeitfehler: Nicht behandelte Fehler in Silverlight-Anwendung Eine Ausnahme während des Betriebs aufgetreten ist, das Ergebnis ungültig zu machen. Überprüfen Sie InnerException auf Ausnahmebedingungsdetails. bei System.ComponentModel.AsyncCompletedEventArgs.RaiseExceptionIfNecessary() bei System.Net.DownloadStringCompletedEventArgs.get_Result() bei JWTG.MainPage.ClientDownloadStringCompleted (Object sender, DownloadStringCompletedEventArgs e) bei System.Net.WebClient.OnDownloadStringCompleted (DownloadStringCompletedEventArgs e) bei System.Net.WebClient.DownloadStringOperationCompleted (Objekt arg)

Ich habe viele Dinge ausprobiert, aber alle fehlgeschlagen.

Was fehlt mir? Oder weiß jemand, wie ich das anders erreichen könnte?

Vielen Dank im Voraus!

+0

Sie erhalten einen JScript Fehler. Ihr geposteter Code hat nichts mit dem Fehler zu tun. Ich habe gerade dein Snippet ausprobiert, und es funktioniert. BTW: Sie müssen das 'this.txbSummery.Text = this.result;' in Ihre 'ClientDownloadStringCompleted' Methode verschieben. Derzeit versuchen Sie, den Text vor dem Herunterladen in das Textfeld zu stellen. Das funktioniert offensichtlich nicht. –

+0

Werfen Sie einen Blick auf: http://forums.silverlight.net/forums/t/54721.aspx vielleicht hilft Ihnen das. Das Problem kann eine falsch konfigurierte 'web.config'-Datei sein. –

Antwort

1

Dies steht im Zusammenhang mit clientaccesspolicy.xml. Lesen Sie hier mehr: 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

Hallo, Ich fand es heraus. Die Website, auf die ich mit silverlight zugreifen wollte, hat die Richtliniendatei nicht. Danke trotzdem! – Yustme

0

In dieser Zeile

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

Sie einen asynchronen Download in einem Hintergrund-Thread sind unter Angabe. Und in der nächsten Zeile erwarten Sie irgendwie, dass es fertig ist?

Wenn Sie keine Kenntnisse über Threading haben, versuchen Sie es zuerst mit DownloadString. Dann wird dein Code funktionieren.

+0

Hallo, Ich habe versucht, diese "nächste Zeile" im Download-Callback, aber das hat nicht den Laufzeitfehler behoben. Wo finde ich diesen 'downloadstring'? Zu welcher Klasse gehört es? – Yustme

+0

@Foxfire: Sie möchten nicht wirklich einen blockierenden Anruf machen, um eine Webseite zu erhalten, oder? Yustme sollte nur 'DownloadStringAsync' verwenden, aber die Logik der Verarbeitung der zurückgegebenen Daten in die' ClientDownloadStringCompleted'-Methode schreiben. –

+0

@Yustme: Sie können das Ding danach nicht in das Ereignis einfügen, weil es von einem anderen Thread aufgerufen wird. – Foxfire

1

Versuchen Sie diese anstelle Ihrer btn1_Click und ClientDownloadStringCompleted Methoden. Es ruft den GUI-Thread auf, nachdem der Feed heruntergeladen wurde, um das Textfeld zu aktualisieren. Wenn es aufgrund eines Fehlers im Netzwerk fehlschlägt, entpackt es die Ausnahme (die als innere Ausnahme in einem enthalten ist) und erneut die innere Ausnahme.

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

Wenn der Fehler occures wieder (ich denke, das passieren wird), bitte hier einen Stacktrace und Fehlermeldung senden.

+0

Hallo, Irgendwie ich diesen Beitrag übersehen: o Das ist, was ich bekommen. throw new Error ("Nicht behandelte Fehler in Silverlight-Anwendung Eine Ausnahme während des Betriebs aufgetreten ist, das Ergebnis ungültig machen prüfen Innerexception für Ausnahmedetails. bei System.ComponentModel.AsyncCompletedEventArgs.RaiseExceptionIfNecessary() \ n bei System.Net.DownloadStringCompletedEventArgs.get_Result() \ n bei JWTG.MainPage. <> c__DisplayClass2. b__0() "); gibt es keinen Stacktrace – Yustme

+0

Verdammt, das ist wieder in einer Ausnahme boxed. Könntest du dir vielleicht die innere Ausnahmeregelung anschauen? Entweder benutze den Debugger, oder ersetze einfach 'throw tiex.InnerException;' mit 'throw tiex.InnerException.InnerException;' –

+0

Es kommt nie so weit, es stoppt bei Dispatcher.BeginInvoke (() => this.txbSummery.Text = e .Result ?? ""); aber siehe meine Post unter dieser für weitere Informationen – Yustme

1

Sie versuchen, es

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; 

    }