2009-09-23 99 views
8

Estoy usando la clase Web Client para descargar archivos de Internet (Flickr en realidad). Esto funciona bien siempre que use: WebClient().DownloadData(string), sin embargo, esto bloquea la UI ya que no es asincrónico.No se puede convertir System.String a System.Uri

Sin embargo, cuando intento WebClient().DownloadDatAsync(string), aparece un error de compilación: "No se puede convertir System.String a System.Uri".

El MediumUrl cadena devuelve "http://farm4.static.flickr.com/2232/2232/someimage.jpg"

Así que la pregunta es ¿cómo puedo convertir la cadena "http://farm4.static.flickr.com/2232/2232/someimage.jpg" a un URI.

cosas que he tried-

  1. he tratado de echarlo a Uri, pero eso no funciona bien.
  2. He intentado Uri myuri = new uri(string) - errores como los anteriores.

    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

¿qué versión de .NET framework estás usando? ¿Es un marco compacto? –

+0

@Dave Rook: para aplicar sangría al código en una lista, debe sangrar cada línea por 8 espacios. Es una peculiaridad de Markdown. Consulte http://meta.stackexchange.com/questions/3792/how-to-nest-code-within-a-list-using-markdown – BoltClock

+0

@Dave Rook: editó esta publicación y nos llamó la atención un par de Hace semanas (que fue cómo pude hacerte ping). Un poco de retraso, pero pensé que te dejaría saber de todos modos. – BoltClock

Respuesta

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

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

Ésta es la forma habitual de crear un URI de una cadena ... No veo por qué no funcionaría si la cadena es un URI válido

+0

Gracias. Intenté eso también (lo siento, no lo mencioné anteriormente) - no hay dados. Error de compilación. – dezkev

+3

¿Qué error de compilación? –

+0

Crea bien en mi proyecto –

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

Así que su ejemplo podría ser:

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

Es posible que debas hacer un check in para ver que la operación se ha completado.

Espero que ayude,

Dan

+0

Lo siento no funciona; Ahora el error es el siguiente: No se puede resolver el constructor: los candidatos de Memory Stream (void) son: MemoryStream (byte []) (en la secuencia de memoria de clase) memoryStream (int) (en la secuencia de memoria de clase) – dezkev

+0

public void DownloadDataAsync (System .Uri dirección) Miembro de System.Net.WebClient Resumen: Descarga el recurso especificado como una matriz System.Byte. Este método no bloquea el hilo de llamada. Parámetros: dirección: Un System.Uri que contiene el URI para descargar. – dezkev

0

Si entiendo su código correctamente, entonces

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

debería funcionar.

+0

Sí, quiero usar el método Async pero no puedo debido a la cadena de cosas de Uri. El método anterior funciona bien. – dezkev

20

Esto funciona bien;

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

Por cierto; Noté que escribiste mal la expresión uri nuevo (..., con uri minúscula. Este no es tu problema, ¿verdad? Porque debería ser "nuevo Uri".

+0

No, no hay errores tipográficos en mi código solo al tipear aquí. También el URl se genera dinámicamente en tiempo de ejecución. – dezkev

5

De acuerdo, entonces creo que si los demás han demostrado tu URI es válido en su código y compila, etc. y también menciona que se genera en tiempo de ejecución: ¿podría ser que el UriString que está generando en tiempo de ejecución no es válido y no es lo que esperaba?

En lugar de dejar una excepción ser lanzado para intentar crear un URI de una cadena no válida, sugeriría el siguiente método IsWellFormedUriString en la clase Uri.

string uriString = "your_UriString_here"; 

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

También podría ayudar con la depuración.

Cuestiones relacionadas