URI non valide: le format de l'URI n'a pas pu être déterminé

116

Je reçois toujours cette erreur.

URI non valide: le format de l'URI n'a pas pu être déterminé.

le code que j'ai est:

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

Mise à jour: le contenu de slct.Text est ftp.jt-software.net/style.css.

Ce qui donne? Comment n'est-ce pas un format d'URI valide? C'est du texte brut.

abatishchev
la source
Il me dit que le contenu de slct.Text n'est pas un Uri valide. Mais il est.
1
@jts: pourriez-vous publier l'URI incriminé peut-être?
Mitch Wheat
Obtenez-vous une exception lors de la création de l'URI avec un nouvel Uri ou lorsque vous essayez de supprimer le fichier sur le serveur?
Simon
2
l'URI incriminé est: ftp.jt-software.net/style.css
2
@jts, je suppose que ces votes négatifs provenaient de personnes qui ont laissé un commentaire et ont découvert que vous n'avez pas mis à jour votre réponse. Notez que vous pouvez modifier votre question pour la rendre complète (et accepter les réponses), pour garder SO propre. Vous manquiez ftp://ou http://dans votre URI. Vous obtenez mon vote maintenant ;-)
Abel

Réponses:

126

Il peut être utile d'utiliser un constructeur différent pour Uri.

Si vous avez le nom du serveur

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

et avoir un chemin Uri relatif à y ajouter, par exemple

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

Lors de la création d'un Uri à partir de ces deux, j'obtiens l'exception "format n'a pas pu être déterminé" sauf si j'utilise le constructeur avec l'argument UriKind, ie

// 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
la source
59

Vérifiez les raisons possibles ici: http://msdn.microsoft.com/en-us/library/z6c2z492(v=VS.100).aspx

ÉDITER:

Vous devez mettre le préfixe du protocole devant l'adresse, c'est à dire dans votre cas "ftp: //"

Simon
la source
3
Rien de mal du tout. Je faisais tout très rapidement, et j'ai accidentellement cliqué sur le bouton vers le bas, et cela disait qu'à moins que la question ne soit modifiée, je ne peux pas l'annuler, donc si vous pouviez gentiment modifier votre question ou quelque chose, je peux vous voter à nouveau :) Alors désolé à ce sujet :-( Je ne voulais pas vous
voter en arrière au lieu de jts. Depuis que ce dernier a disparu :)
Andy
1
@Simon, je viens de vous voter UP à nouveau, désolé pour le retard ÉNORME! Vous pouvez me frapper 2 fois lol
13

On dirait que cela pourrait être un uri réel. J'ai rencontré ce problème lors de l'utilisation de Silverlight multi-navigateurs; sur mon blog, j'ai mentionné une solution de contournement: passer un uri "context" comme premier paramètre.

Si l'URI est réel, l'URI de contexte est utilisé pour créer un uri complet. Si l'URI est absolu, l'URI de contexte est ignoré.

EDIT: Vous avez besoin d'un "schéma" dans l'URI, par exemple "ftp: //" ou "http: //"

Stephen Cleary
la source
12

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

Exemple :-

 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
la source
4
Cela ne fournit pas de solution. Il vérifie simplement si l'URI est correct et si c'est le cas, il continue.
Alexandru Dicu
2

Le problème pour moi était que lorsque j'ai obtenu un nom de domaine, j'avais:

cloudsearch -..-..- xxx.aws.cloudsearch ... [FAUX]

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

j'espère que cela fera le travail pour vous :)

WareN le GaMeR
la source