testare i link e visualizzare stringa degli errori HTTP

Domanda testare i link e visualizzare stringa degli errori HTTP

  • giovedì 15 marzo 2012 08:34
     
     

    Salve,

    nella mia applicazione silverlight ho una tabella che visualizza una collezione di oggetti con all'interno dei link per raggiungerli. Avrei bisogno però di testare i link prima che l'utente ci clicchi sopra e visualizzare quindi in una colonna l'eventuale messaggio di errore HTTP (403,405,500, ecc.). Come posso testare quindi tutti i link della tabella e ottenere la stringa di errore HTTP?

    Grazie

    Stefano

Tutte le risposte

  • giovedì 15 marzo 2012 08:45
     
     
    Puoi usare l'oggetto WebClient e per tentare di caricare la pagina, quindi valorizzare la colonna con il risultato di tale operazione: http://forums.silverlight.net/t/51762.aspx.

    Marco Minerva [MCPD]
    Blog: http://blogs.ugidotnet.org/marcom
    Twitter: @marcominerva

  • giovedì 15 marzo 2012 11:23
     
      Contiene codice

    ma nella funzione:

    c_DownloadStringCompleted(object sender, DownloadStringCompletedEventArgs e)
     {
       if (e.Error == null)
       {
         // at this point, you know it exists
       }
     }

    come faccio ad assegnare l'errore al singolo oggetto della collezione? cioè come faccio ad accedere all'oggetto visto che è una chiamata asincrona?

    grazie

  • giovedì 15 marzo 2012 11:36
     
      Contiene codice

    Dipende da dove e come hai memorizzato la tua collezione.

    Supponendo che tu abbia una lista così dichiarata:

    List<my_element> myList = new List<my_element>();

    Puoi fare un ciclo foreach in cui, per ogni elemento, vai a richiamare il metodo WebClient.DownloadStringAsync, passandogli l'URL dell'elemento e, come secondo parametro, l'elemento stesso:

    c.DownloadStringAsync(curr_element.URL, curr_element);

    Questo overload del metodo, infatti, ti permette di specificare un oggetto che sarà inserito nell'oggetto UserState passato all'evento DownloadStringCompleted. Grazie ad esso, puoi sapere a quale elemento si riferisce la richiesta che stai elabodando:

    c_DownloadStringCompleted(object sender, DownloadStringCompletedEventArgs e)
    {
        my_element el = e.UserState as my_element;    // Recupera l'elemento a cui si riferisce la richiesta.
        if (e.Error == null)
        {
            //at this point, you know it exists.
            el.IsUrlValid = true;
        }
        else
        {
            el.IsUrlValid = false;
        }
    }


    Marco Minerva [MCPD]
    Blog: http://blogs.ugidotnet.org/marcom
    Twitter: @marcominerva

  • giovedì 15 marzo 2012 13:47
     
      Contiene codice

    direi che ho qualche problema..

    Riesco ad accedere al singolo oggetto. e qui tutto bene.

    solo che:

    1) ho notato che e.error non è mai nullo (anche se poi e.error.message = "");

    2) pur ponendo blink.isError = true i valori degli oggetti non si aggiornano.

    inserisco il codice:

     public void TestLink()
            {
                foreach (LinkList lk in LinkCollection)
                {
                    WebClient c = new WebClient();
                    
                    c.DownloadStringCompleted += new DownloadStringCompletedEventHandler(c_DownloadStringCompleted);
                    c.DownloadStringAsync(new Uri(lk.Url, UriKind.RelativeOrAbsolute), lk);
                }
            }
    
            void c_DownloadStringCompleted(object sender, DownloadStringCompletedEventArgs e)
            {
                LinkList blink = e.UserState as LinkList;
    
    
                if (e.Error == null)
                {
                    blink.IsError = false;
                }
                else
                {
                    blink.Errore = e.Error.Message;
                    blink.IsError = true;
                }
            }
    
            private ObservableCollection<LinkList> _LinkCollection;
            public ObservableCollection<LinkList> LinkCollection
            {
                get
                {
                    return _LinkCollection;
                }
                set
                {
                    _LinkCollection = value;
    
                    OnPropertyChanged("LinkCollection");
                }
            }
    
            private void OnPropertyChanged(string name)
            {
                if (PropertyChanged != null)
                {
                    PropertyChangedEventArgs e = new PropertyChangedEventArgs(name);
    
                    PropertyChanged(this, e);
                }
            }

  • giovedì 15 marzo 2012 14:09
     
     

    direi che ho qualche problema..

    Riesco ad accedere al singolo oggetto. e qui tutto bene.

    solo che:

    1) ho notato che e.error non è mai nullo (anche se poi e.error.message = "");

    2) pur ponendo blink.isError = true i valori degli oggetti non si aggiornano.

    1) L'errore che ottieni è una SecurityException. Se gli Url in questione fanno parte di un sito a cui tu hai accesso, devi inserire nella root di tale sito un file con le cross-domain policy per consentire l'accesso anche ad applicazioni Silverlight esterne. Se, invece, si tratta di Url qualsiasi, poiché Silverlight non consente di effettuare richieste verso siti diversi da quelli del dominio in cui si trova, devi adottare una soluzione alternativa al WebClient.

    Ad esempio, puoi definire un servizio WCF sul server che ospita l'applicazione Silverlight, a cui quest'ultima deve fare la richiesta di esistenza del sito Web. Il servizio WCF non ha restrizioni di accesso, quindi al suo interno puoi usare il WebClient e restituire a Silverlight un valore che indica se il sito è raggiungibile oppure no.

    2) Non stai notificando il cambiamento della valore di tale proprietà. Stai modificando la proprietà IsError su un oggetto di tipo LinkList, quindi in quest'ultimo devi implementare l'interfaccia INotifyPropertyChanged e, al solito, fare la notifica nel set della proprietà IsError.


    Marco Minerva [MCPD]
    Blog: http://blogs.ugidotnet.org/marcom
    Twitter: @marcominerva

  • giovedì 15 marzo 2012 14:46
     
     

    Ok, grazie. Ho risolto il problema dell'aggiornamento dei dati. Per quanto riguarda il test dei link penso che controllando direttamente il messaggio posso aggirare il problema.

    Grazie per l'aiuto.

    Stefano

  • giovedì 15 marzo 2012 14:52
     
     

    Per quanto riguarda il test dei link penso che controllando direttamente il messaggio posso aggirare il problema.

    Come pensi di fare? Te lo chiedo anche per curiosità :-)

    Marco Minerva [MCPD]
    Blog: http://blogs.ugidotnet.org/marcom
    Twitter: @marcominerva

  • giovedì 15 marzo 2012 15:03
     
      Contiene codice
     if (e.Error.Message == "")
                {
                    blink.IsError = false;
                }
                else
                { ...}

    però in realtà adesso sto vedendo che alcuni link li da per buoni anche se non lo sono.... tipo

    https://www.google.itasd  

    quindi boh! :-)

  • giovedì 15 marzo 2012 15:12
     
     

    Come ti ho spiegato prima, questo approccio non va bene, poiché Silverlight non consente di effettuare richieste verso siti diversi da quelli del dominio in cui si trova, generando una SecurityException.

    Devi quindi utilizzare la soluzione che ti ho descritto prima.


    Marco Minerva [MCPD]
    Blog: http://blogs.ugidotnet.org/marcom
    Twitter: @marcominerva