URI no válido: no se pudo determinar el formato del URI

115

Sigo recibiendo este error.

URI no válido: no se pudo determinar el formato del URI.

el código que tengo es:

Uri uri = new Uri(slct.Text);
if (DeleteFileOnServer(uri))
{
    nn.BalloonTipText = slct.Text + " has been deleted.";
    nn.ShowBalloonTip(30);
}

Actualización: el contenido en slct.Text es ftp.jt-software.net/style.css.

¿Lo que da? ¿Cómo es que no es un formato URI válido? Es texto sin formato.

abatishchev
fuente
Me está diciendo que el contenido de slct.Text no es un Uri válido. Pero es.
1
@jts: ¿podrías publicar el URI ofensivo quizás?
Mitch Wheat
¿Obtiene una excepción al crear el Uri con un nuevo Uri o al intentar eliminar el archivo en el servidor?
Simon
2
el uri infractor es: ftp.jt-software.net/style.css
2
@jts, supongo que esos votos negativos provienen de las personas que dejaron un comentario y descubrieron que no actualizaste tu respuesta. Tenga en cuenta que puede editar su pregunta para completarla (y aceptar respuestas), para mantener TAN limpio. Faltabas ftp://o http://en tu URI. Obtienes mi voto ahora ;-)
Abel

Respuestas:

126

Puede resultar útil utilizar un constructor diferente para Uri.

Si tiene el nombre del servidor

string server = "http://www.myserver.com";

y tener una ruta Uri relativa para agregarle, p. ej.

string relativePath = "sites/files/images/picture.png"

Al crear un Uri a partir de estos dos, obtengo la excepción "no se pudo determinar el formato" a menos que use el constructor con el argumento UriKind, es decir

// this works, because the protocol is included in the string
Uri serverUri = new Uri(server);

// needs UriKind arg, or UriFormatException is thrown
Uri relativeUri = new Uri(relativePath, UriKind.Relative); 

// Uri(Uri, Uri) is the preferred constructor in this case
Uri fullUri = new Uri(serverUri, relativeUri);
CJBrew
fuente
59

Consulte las posibles razones aquí: http://msdn.microsoft.com/en-us/library/z6c2z492(v=VS.100).aspx

EDITAR:

Debe poner el prefijo del protocolo delante de la dirección, es decir, en su caso, "ftp: //"

Simón
fuente
3
Nada malo en absoluto. Estaba haciendo todo muy rápido, y accidentalmente hice clic en el botón hacia abajo, y decía que a menos que la pregunta sea editada no puedo deshacerla, así que si puedes editar tu pregunta o algo así, puedo volver a votar :) Sobre eso :-( No
votando hacia atrás en lugar de jts. Dado que este último desapareció :)
Andy
1
@Simon, acabo de votar por ti nuevamente, ¡perdón por la ENORME demora! Puedes golpearme 2 veces lol
13

Parece que podría ser un uri real. Me encontré con este problema al utilizar Silverlight en varios navegadores; en mi blog mencioné una solución: pasar un uri de "contexto" como primer parámetro.

Si el uri es real, el uri de contexto se usa para crear un uri completo. Si el uri es absoluto, se ignora el uri de contexto.

EDITAR: Necesita un "esquema" en la uri, por ejemplo, "ftp: //" o "http: //"

Stephen Cleary
fuente
12

Mejor uso Uri.IsWellFormedUriString(string uriString, UriKind uriKind). http://msdn.microsoft.com/en-us/library/system.uri.iswellformeduristring.aspx

Ejemplo: -

 if(Uri.IsWellFormedUriString(slct.Text,UriKind.Absolute))
 {
        Uri uri = new Uri(slct.Text);
        if (DeleteFileOnServer(uri))
        {
          nn.BalloonTipText = slct.Text + " has been deleted.";
          nn.ShowBalloonTip(30);
        }
 }
Ashish Gupta
fuente
4
Esto no proporciona una solución. Solo verifica si el URI es correcto y, si es así, continúa.
Alexandru Dicu
8

Trabajé alrededor de esto usando UriBuilder en su lugar.

UriBuilder builder = new UriBuilder(slct.Text);

if (DeleteFileOnServer(builder.Uri))
{
   ...
}

fuente
2

El problema para mí fue que cuando obtuve un nombre de dominio, tenía:

cloudsearch -..-..- xxx.aws.cloudsearch ... [INCORRECTO]

http: //cloudsearch-..-..-xxx.aws.cloudsearch ... [DERECHA]

espero que esto haga el trabajo por ti :)

GUARDAR EL JUEGO
fuente