URI non valido: non è stato possibile determinare il formato dell'URI


116

Continuo a ricevere questo errore.

URI non valido: non è stato possibile determinare il formato dell'URI.

il codice che ho è:

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

Aggiornamento: il contenuto in slct.Text è ftp.jt-software.net/style.css.

Cosa succede? Perché non è un formato URI valido? È testo semplice.


Mi sta dicendo che il contenuto di slct.Text non è un Uri valido. Ma è.

1
@jts: potresti pubblicare l'URI offensivo forse?
Mitch Wheat

Ricevi un'eccezione quando crei l'URI con il nuovo Uri o quando provi a eliminare il file sul server?
Simon

2
l'uri incriminato è: ftp.jt-software.net/style.css

2
@jts, presumo che quei voti negativi provenissero dalle persone che hanno lasciato un commento e hanno scoperto che non hai aggiornato la tua risposta. Nota, puoi modificare la tua domanda per completarla (e accettare le risposte), per mantenerla pulita. Mancavi ftp://o http://nel tuo URI. Ottieni il mio voto ora ;-)
Abel

Risposte:


126

Può essere utile utilizzare un costruttore diverso per Uri.

Se hai il nome del server

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

e avere un percorso Uri relativo da aggiungere ad esso, ad es

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

Quando creo un Uri da questi due ottengo l'eccezione "il formato non può essere determinato" a meno che non utilizzo il costruttore con l'argomento UriKind, ad es.

// 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);

59

Controlla i possibili motivi qui: http://msdn.microsoft.com/en-us/library/z6c2z492(v=VS.100).aspx

MODIFICARE:

Devi mettere il prefisso del protocollo davanti all'indirizzo, cioè nel tuo caso "ftp: //"


3
Niente di sbagliato. Stavo facendo tutto molto velocemente, e ho accidentalmente cliccato sul pulsante giù, e ha detto che a meno che la domanda non venga modificata non posso annullarla, quindi se potessi gentilmente modificare la tua domanda o qualcosa del genere, posso ribaltarti :) Mi dispiace a tale proposito :-( Non intendevo farti un downvote

votare a favore invece di jts. Dato che quest'ultimo è scomparso :)
Andy

1
@ Simon, ti ho appena votato di nuovo, scusa per l'ENORME ritardo! Puoi darmi un pugno 2 volte lol

13

Sembra che potrebbe essere un vero uri. Ho riscontrato questo problema durante l'esecuzione di Silverlight cross-browser; sul mio blog ho menzionato una soluzione alternativa: passare un uri "context" come primo parametro.

Se l'uri è realtive, il contesto uri viene utilizzato per creare un uri completo. Se l'uri è assoluto, l'uri di contesto viene ignorato.

EDIT: hai bisogno di uno "schema" nell'uri, ad esempio "ftp: //" o "http: //"


12

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

Esempio :-

 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);
        }
 }

4
Ciò non fornisce una soluzione. Controlla solo se l'URI è corretto e, in tal caso, continua.
Alexandru Dicu

8

Ho aggirato questo problema utilizzando invece UriBuilder .

UriBuilder builder = new UriBuilder(slct.Text);

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

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.