Con risposta Leggere da file remoti

  • sabato 31 marzo 2012 21:26
     
     

    Ciao a tutti, domanda già fatta mille volte, credo...

    Avrei bisogno di un aiuto per leggere da un file XML, situato su un Server (non mio) e un file .txt

    Entrambi i file vengono aggiornati ogni 2 minuti circa, e io avrei bisogno di effettuare un accesso, NON in cache ai file, in modo da avere sempre la versione più recente di essi nell'App... Io, come ripeto non ho possibilità di toccare questi files, essendo su Server esterni...

    Per leggere il file .txt, tutto OK la prima volta, ma se provo a rileggerlo, ottengo la copia cache di esso (uso un oggetto di tipo WebClient per la request)..

    Per il file XML, non so proprio come fare....

    Grazie in anticipo, Matteo

Tutte le risposte

  • domenica 1 aprile 2012 10:01
     
     Con risposta

    Ciao Matteo,

    per risolvere il problema della cache puoi semplicemente appendere un parametro all'url.

    Se devi scaricare il file http://pippo.com/data.txt

    aggiungi "?nocache="+ DateTime.Now.Ticks;

    In pratica dovrai ottenere qualcosa tipo: http://pippo.com/data.txt?nocache=123456789

    Così facendo avrai sempre la copia aggiornata.

    Nota che:

    - al posto di nocache puoi inserire un qualsiasi nome di fantasia

    - se il tuo indirizzo contiene altri parametri devi semplicemente concatenare il tuo utilizzando il carattere &:

    in pratica se questo è l'indirizzo http://pippo.com/?format=txt

    dovrai farlo diventare così: http://pippo.com/?format=txt&nocache=123456789

    Per l'xml cosa non ti è chiaro?

    Puoi leggerlo come semplice file di testo, oppure puoi utilizzare le classi apposite.

    Stefano




  • lunedì 2 aprile 2012 11:40
     
     

    ma io uso la classe XmlReader...Faccio così..

    XmlReader xml;

    xml = XmlRaeder.Create(http://www.pippo.com/pierino.xml);

    solo che mi da un eccezione....

  • lunedì 2 aprile 2012 13:24
     
     

    ciao

    che eccezione? puoi postare il testo del .Message ed eventualmente del .InnerException dell'eccezione?

    hai provato a copiare il file in locale usando WebClient o HttpWebClient?? nel caso hai lo stesso errore??

    a presto


    Antonio Esposito [MCT, MCPD, MCTS, MCP]
    dotnetlombardia.org | blog | web | @tonyexpo
    Italy
     

  • venerdì 6 aprile 2012 16:15
     
     
    Ciao..... Scusa, ma non so come copiare un file in locale...… Cioè...ci ho provato...scriveva, ma dopo non riusciva a Leggere....
  • venerdì 6 aprile 2012 18:52
     
     

    ciao

    per copiare il file in locale, basta usare la classe WebClient

    http://msdn.microsoft.com/it-it/library/system.net.webclient(v=vs.80).aspx

    questa ha un comodo metodo DownloadFile

    dopo, prova a leggere l'xml da uno stream in locale usando ad esempio File.OpenRead

    a presto


    Antonio Esposito [MCT, MCPD, MCTS, MCP]
    dotnetlombardia.org | blog | web | @tonyexpo
    Italy
     

  • venerdì 6 aprile 2012 21:22
     
     

    ciao

    mi sento veramente impedito… Nessuno dei due metodi funziona......… Anzi… non è nemmeno incluso nell'IntelliSense..

  • sabato 7 aprile 2012 07:48
     
     Con risposta

    Ciao,

    non demoralizzarti :)

    Continua a cercare una soluzione, di solito una ricerca su Google porta sempre i suoi frutti :)

    Il metodo  DownloadFile non è disponibile su Windows Phone.

    Quando sfogli msdn devi assicurarti di essere nella sezione silverlight

    (partendo dal link di Antonio Esposito nella parte alta trovi scritto Classe WebClient

    e sotto .NET Framework 2.0 e subito dopo un menu a tendina! Usa quel menu e seleziona silverlight)

    Una volta selezionato silverlight puoi utilizzare tutti i metodi e le proprietà che hanno l'icona blu con il telefono bianco.

    Chiarito questo, il metodo che puoi utilizzare è OpenReadAsync(Uri)

    - Crei un nuovo WebClient

    - Sottoscrivi l'evento OpenReadCompleted

    - Chiami il metodo OpenReadAsync

    Ora hai uno stream con i tuoi dati.

    Dato che stai lavorando con dei file  xml ti consiglio di utilizzare la classe XDocument/XElement

    http://msdn.microsoft.com/en-us/library/system.xml.linq.xelement(v=vs.95).aspx

    Puoi utilizzare il metodo Load e passargli lo stream ottenuto nei passaggi precedenti

    http://msdn.microsoft.com/en-us/library/cc838776(v=vs.95).aspx

    Stefano

    p.s. per poter utilizzare la classe XElement devi aggiungere una riferimento alla libreria System.Xml.Linq.dll

    Sai come fare?

    • Contrassegnato come risposta WinTeo_92 martedì 10 aprile 2012 19:18
    •  
  • sabato 7 aprile 2012 21:28
    Moderatore
     
     Con risposta

    Aggiungo un informazione rispetto a quanto detto da Stefano: la classe WebClient espone anche il metodo DownloadStringAsync, che serve proprio per scaricare file di tipo testuale (come per l'appunto file XML o JSON). Il metodo OpenReadAsync si usa solitamente per i file binari (immagini, PDF, ecc.) proprio perchè restituisce uno Stream, mentre il metodo DownloadStringAsync restituisce una stringa.

    A parte questa precisazione, il meccanismo che ti ha spiegato Stefano è corretto, quindi segui le sue indicazioni!

    Aggiungo inoltre, come correttamente ti ha fatto notare Stefano, che Silverlight è un ambiente fortemente asincrono: per questo motivo la classe WebClient espone solamente le versioni asincrone dei metodi per fare download e upload di file, al contrario di quanto avviene nel framework .NET full, nel quale sono esposti sia i metodi sincroni (es., DownloadString) che asincroni (es., DownloadStringAsync).

    Ciao!

  • martedì 10 aprile 2012 19:18
     
     

    Per includere un assembly sono capace, grazie lo stesso! :)

    Allora.....per ora sto usando ancora la classe XmlReader, e per ora non mi ha dato grossi problemi, a parte due problemi di logica....

    Colgo l'occasione per ringraziare tutti coloro che mi hanno aiutato con questo mio problema… "Il caso è chiuso!!"