2010-05-03 11 views
5

Estoy tratando de obtener el contenido html de una página usando Silverlight. Las clases de respuesta web y solicitud no funcionan en Silverlight.obtener contenido html de una página con Silverlight

Hice algunos google y encontré algo. Esto es lo que he intentado:

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

Me da un error de ejecución después de pulsar el botón:

Microsoft error de ejecución de JScript: no controlada de error en una aplicación de Silverlight ha producido una excepción durante la operación, por lo que el resultado no válido. Marque InnerException para detalles de la excepción. en System.ComponentModel.AsyncCompletedEventArgs.RaiseExceptionIfNecessary() en System.Net.DownloadStringCompletedEventArgs.get_Result() en JWTG.MainPage.ClientDownloadStringCompleted (remitente del objeto, DownloadStringCompletedEventArgs e) en System.Net.WebClient.OnDownloadStringCompleted (DownloadStringCompletedEventArgs e) en System.Net.WebClient.DownloadStringOperationCompleted (Object arg)

He intentado varias cosas pero todas fallaron.

¿Qué me falta? ¿O alguien sabe cómo podría lograr esto de una manera diferente?

¡Gracias de antemano!

+0

que está recibiendo un error de JScript. Su código publicado no tiene nada que ver con el error. Acabo de probar tu fragmento, y funciona. Por cierto: tienes que mover ese 'this.txbSummery.Text = this.result;' en tu método 'ClientDownloadStringCompleted'. Actualmente, intenta poner el texto en el cuadro de texto antes de descargarlo. Eso obviamente no funciona. –

+0

Eche un vistazo a: http://forums.silverlight.net/forums/t/54721.aspx quizás eso lo ayude. El problema puede ser un archivo 'web.config' mal configurado. –

Respuesta

1

Esto está relacionado con clientaccesspolicy.xml. Lee más aquí: 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

Hola, Me di cuenta. El sitio web al que estaba tratando de acceder con Silverlight no tiene el archivo de política. ¡Gracias de cualquier manera! – Yustme

0

En esta línea

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

usted está indicando una descarga asynchroneous en un subproceso en segundo plano. Y en la línea siguiente ¿de alguna manera espera que esté listo?

Si no tiene conocimientos sobre Threading, primero intente con DownloadString. Entonces tu código funcionará.

+0

Hola, Intenté poner esa 'siguiente línea' en la devolución de llamada de descarga, pero eso no solucionó el error de tiempo de ejecución. ¿Dónde puedo encontrar esta 'cadena de descarga'? ¿A qué clase pertenece? – Yustme

+0

@Foxfire: realmente no desea realizar una llamada de bloqueo para recuperar una página web, ¿o sí? Yustme solo debería usar 'DownloadStringAsync', pero ponga la lógica de manejar los datos devueltos en el método' ClientDownloadStringCompleted'. –

+0

@Yustme: tampoco se puede poner la cosa en el evento porque se llamará desde un hilo diferente. – Foxfire

1

Pruebe este, en lugar de sus métodos btn1_Click y ClientDownloadStringCompleted. Invoca el hilo de la GUI después de que se descargó el feed para actualizar el cuadro de texto. Si falla debido a un error en la red, descomprimirá la excepción (contenida como una excepción interna en un TargetInvocationException) y volverá a lanzar la excepción interna.

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 el error occures nuevo (supongo que va a pasar), por favor enviar un mensaje StackTrace y error aquí.

+0

Hola, De alguna manera me daba este post: o Esto es lo que me sale:. tiro nuevo error ("Error no controlada en una aplicación de Silverlight ha producido una excepción durante la operación, por lo que el resultado no válido Compruebe InnerException para detalles de la excepción. en System.ComponentModel.AsyncCompletedEventArgs.RaiseExceptionIfNecessary() \ n en System.Net.DownloadStringCompletedEventArgs.get_Result() \ n en JWTG.MainPage. <> c__DisplayClass2. b__0() "); no hay stacktrace – Yustme

+0

Maldición que nuevamente está en caja en una excepción. Entonces, ¿podrías echar un vistazo a la innerException entonces? Utilice el depurador o simplemente reemplace 'throw tiex.InnerException;' con 'throw tiex.InnerException.InnerException;' –

+0

Nunca llega tan lejos, se detiene en Dispatcher.BeginInvoke (() => this.txbSummery.Text = e .Result ?? ""); pero vea mi publicación debajo de esta para obtener más información – Yustme

1

Intenta que

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; 

    } 
Cuestiones relacionadas