none
Lector RSS RRS feed

  • Pregunta

  • Buenos dias, estory realizando un pequeño lector RSS para implementarlo en una aplicacion silverlight pero me suergen unos errores que no se por donde cojer. Concretamente es al abrir un recurso de la web con WebClient() pongo mi codigo.

    WebClient wc = new WebClient();
                wc.OpenReadCompleted += new OpenReadCompletedEventHandler(wc_OpenReadCompleted);
                Uri feedUri = new Uri("http://www.consumer.es/sindicacion/rss/tecnologia/");
    wc.OpenReadAsync(feedUri);

    El problema lo tengo que cuando intenta cargar los datos en el evento OpenReadCompletedEventHandler(OpenReadCompletedEventArgs e) el objeto e me da un error de seguridad, el erro lo da en el primer using

    using (Stream s = e.Result) {

    SyndicationFeed feed; using (XmlReader reader = XmlReader.Create(s)) { feed = SyndicationFeed.Load(reader); var posts = from item in feed.Items select new LectorRSS() { Titulo = item.Title.Text, Enlace = item.Links[0].Uri.AbsoluteUri, Descripcion = item.Summary.Text }; listRSS.ItemsSource = posts; listRSS.Visibility = Visibility.Visible; } }


    A ver si alguien me puede ayudar, Gracias!!
    viernes, 20 de julio de 2012 10:25

Todas las respuestas

  • Hola Osmagarci, realmente no tuve errores de seguridad con ese código, el único problema fue que en el feed vienen datos vacíos y por ello hay que probar antes de intentar asignarlos por ejemplo:
    select new LectorRSS()
    {
        Titulo = item.Title==null?"No disponible":item.Title.Text,
        Enlace = item.Links[0].Uri.AbsoluteUri==null?"No disponible":item.Links[0].Uri.AbsoluteUri,
        Descripcion = item.Summary==null?"No disponible":item.Summary.Text
    };
    

    Espero te sea de utilidad


    Eliel Aguilera Microsoft Student Partner - Venezuela

    sábado, 21 de julio de 2012 15:30
  • Buenas compi... Sigue dando el mismo error en using (Stream s = e.Result)

    El problema es que e.Result me da error y no puedo asignarlo al objeto 's' de tipo Stream.

    Un saludo.

    martes, 24 de julio de 2012 8:13
  • Hola,

    tienes que hacer un casting de e.Result para poder almacenarlo en un Stream, prueba esto:

    using (Stream s = (Stream)e.Result)
                {  
    		  SyndicationFeed feed;
                    using (XmlReader reader = XmlReader.Create(s))
                    {
                        feed = SyndicationFeed.Load(reader);
                        var posts = from item in feed.Items
                                    select new LectorRSS()
                                    {
                                        Titulo = item.Title.Text,
                                        Enlace = item.Links[0].Uri.AbsoluteUri,
                                        Descripcion = item.Summary.Text
                                    };
                        listRSS.ItemsSource = posts;
                        listRSS.Visibility = Visibility.Visible;
                    }
                }

    Un saludo


    Javier Torrecilla
    Para el correcto funcionamiento, y que otros usuarios se puedan beneficiar de la solucion de esta pregunta por favor marca las respuestas que te hayan ayudado como "Respuesta".
    Si la respuesta te ha sido util Votala.
    Mi Blog: Jtorrecilla
    Enlace a Faq de Winforms en Ingles Muy bueno
    TabControl con Mejoras

    martes, 24 de julio de 2012 8:55
  • Hola jtorrecilla, aprovechando que eres MVP y el tema ¿Hay diferencias substanciales entre distintas versiones del WPF (o VS)? Porque me he encontrado con que doy algunas respuestas y me dicen que no funcionan mientras que en mi VS compilan de maravilla y funcionan correctamente, y como es de imaginarse, en otros casos me han dado respuestas que cuando las intento correr en mi VS me toca hacerle modificaciones. De hecho en este caso yo no hago el casting porque Intellisense me marca e.Result como tipo Stream. Gracias de antemano. Saludos.

    Eliel Aguilera Microsoft Student Partner - Venezuela Blog: http://elielaguilera.com.ve/blog

    martes, 24 de julio de 2012 12:28
  • Hola Eliel,

    Hombre suelen existir ciertas diferencias, normalmente cuando consultas la documentación en MSDN verás que en la parte superior puedes elegir la versión de .NET con la que estás trabajando, y por ello verás cuales están o no disponibles.

    Saludos!


    Javier Torrecilla
    Para el correcto funcionamiento, y que otros usuarios se puedan beneficiar de la solucion de esta pregunta por favor marca las respuestas que te hayan ayudado como "Respuesta".
    Si la respuesta te ha sido util Votala.
    Mi Blog: Jtorrecilla
    Enlace a Faq de Winforms en Ingles Muy bueno
    TabControl con Mejoras

    martes, 24 de julio de 2012 12:48
  • Buenos dias a todos! Pues he probado lo de hacer lo de cast, pero sigue dando error. Es un tipo de error de SegurityException.... Trabajo con la version 4 de .NET...

    Gracias, un saludo!!

    miércoles, 25 de julio de 2012 7:55
  • Hola,

    Podrías poner el texto de la Excepcion y la InnerException?


    Javier Torrecilla
    Para el correcto funcionamiento, y que otros usuarios se puedan beneficiar de la solucion de esta pregunta por favor marca las respuestas que te hayan ayudado como "Respuesta".
    Si la respuesta te ha sido util Votala.
    Mi Blog: Jtorrecilla
    Enlace a Faq de Winforms en Ingles Muy bueno
    TabControl con Mejoras

    miércoles, 25 de julio de 2012 8:16
  • Claro, mira es este (o por lo menos creo que es la causa del problema.....)

    InnerException = {System.Security.SecurityException ---> System.Security.SecurityException: Error de seguridad.
       en System.Net.Browser.BrowserHttpWebRequest.InternalEndGetResponse(IAsyncResult asyncResult)
       en System.Net.Browser.BrowserHttpWebRequest.<>c__DisplayClass...

    miércoles, 25 de julio de 2012 8:54
  • Una pregunta rápida ¿Estás usando SL dentro de una página web o standalone? Si estás usándolo dentro de una página es posible que tengas problemas de seguridad porque se requiere que exista un archivo con políticas de seguridad (clientaccesspolicy.xml o crossdomain.xml, SL intenta encontrar en ese orden los archivos) en el servidor que hospeda el servicio al que intentas acceder.

    Eliel Aguilera Microsoft Student Partner - Venezuela Blog: http://elielaguilera.com.ve/blog

    miércoles, 25 de julio de 2012 13:01
  • Buenas, efectivamente, es una aplicacion de negocios y se ejecuta en Web....

    ¿Donde se supone que tienen que estar esos archivos?

    Gacias, un saludo!

    miércoles, 25 de julio de 2012 13:29
  • El archivo clientaccesspolicy.xml debe estar en la raíz del servidor que hospeda el servicio, en este caso en www.consumer.es, es decir, si buscas www.consumer.es/clientaccesspolicy.xml deberías poder visualizar algo como lo siguiente:

    <?xml version="1.0" encoding="utf-8" ?>
    <access-policy>
    	<cross-domain-access>
    		<policy>
    			<allow-from http-request-headers="*">
    				<domain uri="http://el-dominio-desde-donde-te-conectas"/>
    			</allow-from>
    			<grant-to>
    				<resource path="/" include-subpaths="true"/>
    			</grant-to>
    		</policy>
    	</cross-domain-access>
    </access-policy>
    

    Si deseas permitir que cualquiera tenga acceso puedes cambiar <domain uri="http://el-dominio-desde-donde-te-conectas"/> por <domain uri="*"/> como notarás este ejemplo es bastante permisivo pues permite cualquier verbo, por seguridad es recomendable que los restrinjas sólo a los que necesites.

    Saludos.


    Eliel Aguilera Microsoft Student Partner - Venezuela Blog

    miércoles, 25 de julio de 2012 13:38
  • Gracias por la respuesta! Lo probare a ver. ¿Que pasaría si mi pagina esta hospedada en local (por ahora), y el gestor de noticias es una url externa a mi web? 
    jueves, 26 de julio de 2012 8:23
  • Cuando está en desarrollo podrías "suavizar" las políticas para que no tengas que cambiar cada cierto tiempo los IPs de acceso, luego, cuando vaya a producción si procedes a asegurar el sitio como debe ser.

    Respecto a acceder a servicios de terceros es algo más complicado, bien podrías solicitarle al (a los) administrador(es) del sitio que coloquen el archivo clientaccesspolicy.xml o el crossdomain.xml o si los tienen que te den permisos para acceder desde tu sitio. El resto de lo que te diga es especulación porque recuerdo haber leído que hay un workaround, sin embargo, nunca lo llegué a probar puesto que tenía full acceso al servidor (yo programé tanto la web app como los servicios).


    Eliel Aguilera Microsoft Student Partner - Venezuela Blog

    jueves, 26 de julio de 2012 11:04
  • Osea, que lo tengo crudo para poder implantar un lector RSS a mi sitio web echo con silverlight....
    jueves, 26 de julio de 2012 11:56
  • En mi opinión personalísima y podría estar equivocado, en estos casos suele ser mejor estrategia utilizar otra aproximación quizás html+jquery/ajax+css. Si pruebas el mismo código en WPF te darás cuenta que va de maravilla (con las modificaciones que comentaba más arriba).

    Off topic: Una buena práctica es que cuando utilices operaciones asíncronas, compruebes que no hubo un error y que tampoco fue cancelada (aunque no le des al usuario la opción de cancelar por el momento).


    Eliel Aguilera Microsoft Student Partner - Venezuela Blog

    jueves, 26 de julio de 2012 12:43
  • Pues vaya faenilla....:D:D jajaja. La idea básica es que se pudiera usar dentro del web, y no tener que instalar en cliente. Tendre que buscar info de como poder hacerlo, aun asi, silverlight deberia poder ejecutarlo sin problemas al igual que poder abrir la web en dispositivos android.... En fin gracias de todas formas!

    Saludos! 

    PD: No marco el post como respuesta por si veo alguna solución y la posteo en este hilo. 

    lunes, 30 de julio de 2012 16:39
  • ¡Totalmente! Pero todo sea por la seguridad de nuestros sistemas. Aunque acá luego de pensarlo un rato la mayoría de los navegadores tienen incorporados lectores rss.

    Eliel Aguilera Microsoft Student Partner - Venezuela
    Blog

    lunes, 30 de julio de 2012 16:59
  • Claro, entiendo la seguridad. Pero deberían dar alguna solución al problema.... A proposito, ¿sabes como ejecutar aplicaciones Silverlight en Android?
    lunes, 30 de julio de 2012 19:57
  • Muy offtopic, y realmente no te puedo asegurar que funcione porque no dispongo de ningún dispositivo pero es posible que con Moonlight puedas hacer correr una app SL en Android pero tendrías que compilarlo desde los fuentes y probar.

    Eliel Aguilera Microsoft Student Partner - Venezuela
    Blog

    lunes, 30 de julio de 2012 20:53