2009-09-23 10 views
8

Sto utilizzando la classe Client Web per scaricare file da Internet (in realtà Flickr). Funziona bene finché uso: WebClient().DownloadData(string), tuttavia questo blocca l'interfaccia utente poiché non è asincrono.Impossibile convertire System.String in System.Uri

Tuttavia, quando provo WebClient().DownloadDatAsync(string), viene visualizzato un errore di compilazione: "Impossibile convertire System.String in System.Uri".

Il MediumUrl stringa ritorna "http://farm4.static.flickr.com/2232/2232/someimage.jpg"

Quindi la domanda è: come faccio a convertire la stringa "http://farm4.static.flickr.com/2232/2232/someimage.jpg" a un URI.

cose che ho tried-

  1. ho cercato di gettarlo ai Uri, ma che non funziona neanche.
  2. Ho provato Uri myuri = new uri(string) - errori come sopra.

    foreach (Photo photo in allphotos) 
    { 
        //Console.WriteLine(String.Format("photo title is :{0}", photo.Title)); 
        objimage = new MemoryStream(wc.DownloadData(photo.MediumUrl)); 
        images.Add(new Pictures(new Bitmap(objimage), photo.MediumUrl, photo.Title)); 
    } 
    
+0

quale versione del framework .NET stai usando? È Quadro compatto? –

+0

@Dave Rook: per indentare il codice in un elenco, è necessario indentare ogni riga di 8 spazi. È un capriccio di Markdown. Vedi http://meta.stackexchange.com/questions/3792/how-to-nest-code-within-a-list-using-markdown – BoltClock

+0

@Dave Rook: hai modificato questo post e l'hai portato alla nostra attenzione un paio di settimane fa (che era il modo in cui ero in grado di ping voi). Un po 'di ritardo ma ho pensato di farti sapere a prescindere. – BoltClock

risposta

5
objimage = new MemoryStream(wc.DownloadData(new Uri(photo.MediumUrl))); 

b) I have tried Uri myuri = new uri(string) - errors out as above.

Questo è il solito modo per creare un URI da una stringa ... non vedo il motivo per cui non avrebbe funzionato se la stringa è una valida URI

+0

Grazie. Provato anche questo (scusa non ho menzionato sopra) - niente da fare. Compilare l'errore – dezkev

+3

Che errore di compilazione? –

+0

OK nel mio progetto –

1
var yourUri = new UriBuilder(yourString).Uri; 

Così il vostro esempio può essere:

wc.DownloadDataAsync(new UriBuilder(photo.MediumUrl).Uri); 
objimage = new MemoryStream(wc.Result); 

Potrebbe essere necessario effettuare un check-in per vedere l'operazione è stata completata.

Speranza che aiuta,

Dan

+0

Mi dispiace, non funziona; Ora l'errore è il seguente: Impossibile risolvere il costruttore: I candidati di memoria (vuoto) sono: MemoryStream (byte []) (nel flusso di memoria di classe) memoryStream (int) (nel flusso di memoria di classe) – dezkev

+0

public void DownloadDataAsync (System Indirizzo.) Membro di System.Net.WebClient Riepilogo: Scarica la risorsa specificata come array System.Byte. Questo metodo non blocca il thread chiamante. Parametri: indirizzo: Un System.Uri contenente l'URI da scaricare. – dezkev

0

Se ho ben capito il codice correttamente, quindi

wc.DownloadDataAsync(new Uri(photo.MediumUrl)); 

dovrebbe funzionare.

+0

Sì, voglio usare il metodo Async ma non riesco a causa della stringa su Uri thingy. Il metodo sopra funziona bene. – dezkev

20

Questo funziona bene;

System.Uri uri = new System.Uri("http://farm4.static.flickr.com/2232/2232/someimage.jpg"); 

A proposito; Ho notato che hai digitato in modo errato l'espressione nuovo uri (..., con uri minuscolo.) Non è un tuo problema, vero? Perché dovrebbe essere "nuovo Uri"

+0

No non ci sono errori di battitura nel mio codice solo nella digitazione qui. Anche l'URl viene generato dinamicamente in fase di runtime. – dezkev

5

Okay, quindi penso che se gli altri hanno dimostrato la tua URI è valido nel loro codice e si compila ecc. E si menziona anche che è generato in fase di esecuzione - potrebbe essere che UriString che si sta generando in fase di runtime non è valido e non è quello che si aspetta?

Invece di lasciare un'eccezione essere gettato per aver tentato di creare un URI da una stringa non valida, vorrei suggerire il seguente metodo IsWellFormedUriString sulla classe Uri.

string uriString = "your_UriString_here"; 

if (Uri.IsWellFormedUriString(uriString, UriKind.Absolute)) 
{ 
    Uri uri = new Uri(uriString); 
} 
else 
{ 
    Logger.WriteEvent("invalid uriString: " + uriString); 
} 

Potrebbe anche aiutare con il debug.