Domanda

Per la classe dobbiamo seguire un tutorial per creare un sito web silverlight che le ricerche DIGG per un dato argomento. (Usando questo tutorial come base: http://weblogs.asp.net/scottgu/archive/2010/02/22/first-look-at-silverlight-2.aspx )

Dobbiamo utilizzare il seguente codice per recuperare le informazioni da 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;
        }

E quando boccola il buttonSearch, otteniamo l'errore:

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)

Ho già conosce l'API Digg è obsoleto, ma non credo che questo errore ha nulla a che fare con esso. (Abbiamo anche ottenere un file XML locale, che possiamo usare, ma non ancora del lavoro)

Non ho idea di che cosa sta causando questo e noi non siamo ottenere molto aiuto da nostro maestro, quindi spero che qualcuno ci può aiutare.

Grazie, Thomas

È stato utile?

Soluzione

Per questa sezione di codice:

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

Stai dicendo per visualizzare i racconti se e.Error è non null. Credo che si desidera passare alla condizione di dire e.Error == null, come ciò significherebbe non vi era alcun errore e il suo sicuro da usare il risultato. Si consiglia di mettere un punto di interruzione la condizione di ispezionare il valore di e.Error per vedere se si dispone di un'eccezione lì.

Modifica:

Quando si è modificato la condizione di e.Error == null e accaduto nulla, è perché l'errore è stato non nullo, così la sua dichiarazione DisplayStories(e.Result) mai sparato.

L'eccezione in questione, il SecurityException, accade perché Silverlight nel browser applicazioni non consentono di effettuare chiamate a siti web esterni, a meno che il sito dispone di un file di criteri dei domini Silverlight. Purtroppo, file dei criteri di Digg non consente più l'accesso cross-domain, il che significa che non sarà in grado di fare questa chiamata a meno che non si esegue la vostra applicazione con piena fiducia out-of-browser. Vedere restrizione Network Security L'accesso in Silverlight per maggiori dettagli.

Per eseguire l'applicazione come un'applicazione out-of-browser con piena fiducia, in Visual Studio, fare clic destro del progetto e scegliere Proprietà. Nella scheda "Silverlight", controllare che casella "consentono a corto di browser." Quindi fare clic sul pulsante che dice "Fuori impostazioni del browser." Nella finestra di dialogo, selezionare la casella che dice "richiedono elevata fiducia durante l'esecuzione di fuori del browser." Nella scheda "Debug", per "Azione di avvio," scegliere "Out of applicazione browser" e selezionare il progetto dal menu a discesa.

Quando si esegue in questo modo, non dovrebbe più ottenere il SecurityException.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top