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.

abatishchev
źródło
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);
CJBrew
źródło
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: //"

Szymon
źródło
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: //”

Stephen Cleary
źródło
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);
        }
 }
Ashish Gupta
źródło
4
To nie daje rozwiązania. Po prostu sprawdza, czy identyfikator URI jest poprawny, a jeśli tak, kontynuuje.
Alexandru Dicu
2

Problem polegał na tym, że kiedy dostałem nazwę domeny, miałem:

cloudsearch -..-..- xxx.aws.cloudsearch ... [ ŹLE ]

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

mam nadzieję, że to zadziała dla Ciebie :)

WareN The GaMeR
źródło