Ungültiger URI: Das Format des URI konnte nicht ermittelt werden

115

Ich bekomme immer wieder diesen Fehler.

Ungültiger URI: Das Format des URI konnte nicht ermittelt werden.

Der Code, den ich habe, ist:

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

Update: Der Inhalt in slct.Text ist ftp.jt-software.net/style.css.

Was gibt? Wie ist das kein gültiges URI-Format? Es ist einfacher Text.

abatishchev
quelle
Es sagt mir den Inhalt von slct.Text ist kein gültiger Uri. Aber es ist.
1
@jts: Könntest du vielleicht die beleidigende URI posten?
Mitch Wheat
Erhalten Sie eine Ausnahme, wenn Sie den Uri mit einem neuen Uri erstellen oder wenn Sie versuchen, die Datei auf dem Server zu löschen?
Simon
2
Die beleidigende URL ist: ftp.jt-software.net/style.css
2
@jts, ich gehe davon aus, dass diese Abstimmungen von den Leuten kamen, die einen Kommentar hinterlassen haben und herausgefunden haben, dass Sie Ihre Antwort nicht aktualisiert haben. Beachten Sie, dass Sie Ihre Frage bearbeiten können, um sie zu vervollständigen (und Antworten zu akzeptieren) und SO sauber zu halten. Sie wurden vermisst ftp://oder http://in Ihrer URI. Du bekommst jetzt meine Stimme ;-)
Abel

Antworten:

125

Es kann hilfreich sein, einen anderen Konstruktor für Uri zu verwenden.

Wenn Sie den Servernamen haben

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

und einen relativen Uri-Pfad zum Anhängen haben, z

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

Wenn ich aus diesen beiden eine Uri erstelle, erhalte ich die Ausnahme "Format konnte nicht bestimmt werden", es sei denn, ich verwende den Konstruktor mit dem UriKind-Argument, d. H.

// 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
quelle
59

Überprüfen Sie mögliche Gründe hier: http://msdn.microsoft.com/en-us/library/z6c2z492(v=VS.100).aspx

BEARBEITEN:

Sie müssen das Protokollpräfix vor die Adresse setzen, dh in Ihrem Fall "ftp: //"

Simon
quelle
3
Gar nichts falsch. Ich habe alles sehr schnell erledigt und versehentlich auf den Abwärtsknopf geklickt. Es heißt, dass ich die Frage nicht rückgängig machen kann, wenn sie nicht bearbeitet wird. Wenn Sie also Ihre Frage oder etwas anderes freundlich bearbeiten können, kann ich Sie erneut bewerten :) Entschuldigung darüber :-( Ich wollte dich nicht herabstimmen
zurück stimmen statt jts. Da letzteres verschwunden ist :)
Andy
1
@ Simon, ich habe dich gerade wieder gewählt, sorry für die RIESIGE Verzögerung! Sie können mich 2-mal schlagen lol
13

Klingt so, als wäre es ein realistischer Uri. Ich bin auf dieses Problem gestoßen, als ich browserübergreifendes Silverlight ausgeführt habe. In meinem Blog habe ich eine Problemumgehung erwähnt: Übergeben Sie als ersten Parameter eine "Kontext" -URI.

Wenn der Uri realistisch ist, wird der Kontext-Uri verwendet, um einen vollständigen Uri zu erstellen. Wenn der Uri absolut ist, wird der Kontext-Uri ignoriert.

BEARBEITEN: Sie benötigen ein "Schema" in der URL, z. B. "ftp: //" oder "http: //".

Stephen Cleary
quelle
12

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

Beispiel: -

 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
quelle
4
Dies bietet keine Lösung. Es wird nur geprüft, ob der URI korrekt ist, und wenn ja, wird es fortgesetzt.
Alexandru Dicu
8

Ich habe dies umgangen, indem ich stattdessen UriBuilder verwendet habe.

UriBuilder builder = new UriBuilder(slct.Text);

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

quelle
2

Das Problem für mich war, dass ich, als ich einen Domainnamen bekam, Folgendes hatte:

cloudearch -..-..- xxx.aws.cloudsearch ... [FALSCH]

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

hoffe das macht den Job für dich :)

WareN Der GaMeR
quelle