Pregunta

Para la clase tenemos que seguir un tutorial para crear un sitio web de Silverlight que busque Digg para un tema determinado. (Usando este tutorial como base: http://weblogs.asp.net/scottgu/archive/2010/02/22/first-look-at-silverlight-2.aspx)

Tenemos que usar el siguiente código para obtener la información de DigG.

    private void buttonSearch_Click(object sender, RoutedEventArgs e)
        {
            string topic = textboxSearchTopic.Text;

            WebClient digg = new WebClient();
            digg.DownloadStringCompleted +=
                              new DownloadStringCompletedEventHandler(digg_DownloadStringCompleted);
            digg.DownloadStringAsync(
                         new Uri("http://services.digg.com/1.0/story.getAll?count=10&topic="+topic)); 
}

void digg_DownloadStringCompleted(object sender, DownloadStringCompletedEventArgs e)
{
            if (e.Error != null)
            {
                DisplayStories(e.Result);             
            }
}

private void DisplayStories(string xmlContent)
        {
            XDocument document = XDocument.Parse(xmlContent);

            var stories = from story in document.Descendants("story")
                          where story.Element("thumbnail")!=null
                          select new DiggStory
                         {
                             Id = (string)story.Attribute("id"),
                             Title = (string)story.Element("title"),
                             Description = (string)story.Element("description"),
                             ThumbNail = (string)story.Element("thumbnail").Attribute("src"),
                             HrefLink = (string)story.Attribute("link"),
                             NumDiggs = (int)story.Attribute("diggs")
                         };
         gridStories.ItemsSource = stories;
        }

Y al buje de ButtonSearch, recibimos el error:

An exception occurred during the operation, making the result invalid.  Check InnerException for exception details.

   at System.ComponentModel.AsyncCompletedEventArgs.RaiseExceptionIfNecessary()
   at System.Net.OpenReadCompletedEventArgs.get_Result()
   at DiggSample.Views.Search.Digg_OpenReadCompleted(Object sender, OpenReadCompletedEventArgs e)
   at System.Net.WebClient.OnOpenReadCompleted(OpenReadCompletedEventArgs e)
   at System.Net.WebClient.OpenReadOperationCompleted(Object arg)

Ya sé que la API Digg está desactualizada, pero no creo que este error tenga nada que ver con eso. (Incluso obtenemos un archivo XML local, que podemos usar pero aún no funciona)

No tengo idea de lo que está causando esto y no recibimos mucha ayuda de nuestro maestro, así que espero que alguien pueda ayudarnos.

Gracias Thomas

¿Fue útil?

Solución

Para esta sección del código:

if (e.Error != null)
{
    DisplayStories(e.Result);             
}

Estás diciendo que muestre las historias si E.Error es no nulo. Creo que quieres cambiar la condición para decir e.Error == null, como eso significaría que no hubo error y es seguro usar el resultado. Es posible que desee poner un punto de interrupción en la condición para inspeccionar el valor de e.Error Para ver si tiene una excepción allí.

Editar:

Cuando cambió la condición a e.Error == null Y no pasó nada, eso se debe a que el error no fue nulo, así que tu DisplayStories(e.Result) Declaración nunca disparada.

La excepción en cuestión, el SecurityException, sucede porque las aplicaciones en el navegador de Silverlight no le permiten hacer llamadas a sitios web externos a menos que ese sitio web tenga un archivo de política de dominio cruzado Silverlight. Desafortunadamente, el archivo de póliza de Digg ya no permite el acceso al dominio cruzado, lo que significa que no podrá realizar esta llamada a menos que ejecute su aplicación con plena confianza fuera del navegador. Ver Restricción de acceso a seguridad de red en Silverlight para más detalles.

Para ejecutar su aplicación como una aplicación fuera de navegador con plena confianza, en Visual Studio, haga clic con el botón derecho en su proyecto y elija propiedades. En la pestaña "Silverlight", marque esa casilla que dice "Habilite quedarse sin navegador". Luego haga clic en el botón que dice "Fuera de la configuración del navegador". En el diálogo, marque la casilla que dice "requiere una confianza elevada cuando se ejecute fuera del navegador". En la pestaña "Depurar", para "Iniciar acción", elija "fuera de la aplicación del navegador" y seleccione su proyecto en el menú desplegable.

Cuando corres de esta manera, ya no deberías obtener la Ejecución Security.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top