Nieprawidłowy identyfikator URI: nie można określić formatu identyfikatora URI


116

Ciągle otrzymuję ten błąd.

Nieprawidłowy identyfikator URI: nie można określić formatu identyfikatora URI.

kod jaki mam to:

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

Aktualizacja: zawartość w slct.Text to ftp.jt-software.net/style.css.

Co daje? Dlaczego to nie jest prawidłowy format URI? To zwykły tekst.


Mówi mi, że zawartość slct.Text nie jest prawidłowym Uri. Ale to jest.

1
@jts: czy możesz opublikować naruszający identyfikator URI?
Mitch Wheat

Czy pojawia się wyjątek podczas tworzenia Uri z nowym Uri lub podczas próby usunięcia pliku na serwerze?
Simon

2
obrażający adres

2
@jts, zakładam, że te głosy przeciwne pochodziły od ludzi, którzy zostawili komentarz i odkryli, że nie zaktualizowałeś swojej odpowiedzi. Uwaga, możesz edytować swoje pytanie, aby było kompletne (i akceptować odpowiedzi), aby było tak czyste. Brakowało ftp://lub http://w Twoim URI. Masz teraz mój głos ;-)
Abel

Odpowiedzi:


126

Może pomóc użycie innego konstruktora dla Uri.

Jeśli masz nazwę serwera

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

i mieć względną ścieżkę Uri do dołączenia do niej, np

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

Tworząc Uri z tych dwóch, otrzymuję wyjątek „nie można określić formatu”, chyba że użyję konstruktora z argumentem UriKind, tj.

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

Sprawdź możliwe przyczyny tutaj: http://msdn.microsoft.com/en-us/library/z6c2z492(v=VS.100).aspx

EDYTOWAĆ:

Musisz umieścić przedrostek protokołu przed adresem, np. W twoim przypadku "ftp: //"


3
Zupełnie nic złego. Robiłem wszystko naprawdę szybko i przypadkowo kliknąłem przycisk w dół, a on powiedział, że jeśli pytanie nie jest edytowane, nie mogę tego cofnąć, więc jeśli mógłbyś uprzejmie edytować swoje pytanie lub coś takiego, mogę ponownie zagłosować za Ciebie :) Przepraszam o tym :-( Nie chciałem cię

głosowanie za powrotem zamiast jts. Odkąd ten ostatni zniknął :)
Andy

1
@Simon, właśnie ponownie zagłosowałem na WAS, przepraszam za OGROMNE opóźnienie! Możesz uderzyć mnie 2 razy lol

13

Wygląda na to, że może to być prawdziwe URI. Napotkałem ten problem podczas wykonywania Silverlight w różnych przeglądarkach; na moim blogu wspomniałem o obejściu: jako pierwszy parametr podaj „kontekst” uri.

Jeśli identyfikator uri jest rzeczywisty, kontekstowy identyfikator uri jest używany do tworzenia pełnego identyfikatora uri. Jeśli uri jest bezwzględne, to kontekstowe uri jest ignorowane.

EDYTUJ: potrzebujesz „schematu” w uri, np. „Ftp: //” lub „http: //”


12

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

Przykład: -

 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
To nie daje rozwiązania. Po prostu sprawdza, czy identyfikator URI jest poprawny, a jeśli tak, kontynuuje.
Alexandru Dicu

8

Obejrzałem ten problem, używając zamiast tego UriBuilder .

UriBuilder builder = new UriBuilder(slct.Text);

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

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.