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.


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

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: //"


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: //"


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

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

8

J'ai contourné ce problème en utilisant UriBuilder à la place.

UriBuilder builder = new UriBuilder(slct.Text);

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

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.