Недействительный URI: не удалось определить формат URI.

116

Я все время получаю эту ошибку.

Недействительный URI: не удалось определить формат URI.

код, который у меня есть:

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

Обновление: содержимое в slct.Text есть ftp.jt-software.net/style.css.

Что дает? Как это недопустимый формат URI? Это обычный текст.

abatishchev
источник
Он сообщает мне, что содержимое slct.Text не является допустимым Uri. Но это.
1
@jts: не могли бы вы опубликовать оскорбительный URI?
Митч Уит
Вы получаете исключение при создании Uri с новым Uri или при попытке удалить файл на сервере?
Саймон
2
оскорбительный uri: ftp.jt-software.net/style.css
2
@jts, я предполагаю, что эти отрицательные голоса исходили от людей, которые оставили комментарий и обнаружили, что вы не обновляли свой ответ. Обратите внимание, вы можете отредактировать свой вопрос, чтобы сделать его полным (и принять ответы), чтобы SO был чистым. Вы отсутствовали ftp://или http://указаны в вашем URI. Теперь вы получаете мой голос ;-)
Абель

Ответы:

126

Может помочь использование другого конструктора для Uri.

Если у вас есть имя сервера

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

и добавить к нему относительный путь Uri, например

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

При создании Uri из этих двух я получаю исключение «формат не может быть определен», если я не использую конструктор с аргументом UriKind, т.е.

// 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
источник
59

Проверьте возможные причины здесь: http://msdn.microsoft.com/en-us/library/z6c2z492(v=VS.100).aspx

РЕДАКТИРОВАТЬ:

Вам нужно поставить префикс протокола перед адресом, т.е. в вашем случае "ftp: //"

Саймон
источник
3
Вообще ничего плохого. Я делал все очень быстро, и я случайно нажал кнопку «вниз», и там было сказано, что если вопрос не отредактирован, я не могу его отменить, поэтому, если вы любезно отредактируете свой вопрос или что-то в этом роде, я могу повторно проголосовать за вас :) Извини об этом :-( Я не хотел тебя
голосование за вместо jts. С тех пор как последний исчез :)
Энди
1
@Simon, я только что проголосовал за вас снова, извините за ОГРОМНУЮ задержку! Ты можешь ударить меня 2 раза, лол
13

Похоже, это настоящий uri. Я столкнулся с этой проблемой при кроссбраузерности Silverlight; в своем блоге я упомянул обходной путь: передайте URI «контекста» в качестве первого параметра.

Если uri действительный, контекстный uri используется для создания полного uri. Если uri является абсолютным, то контекстный uri игнорируется.

РЕДАКТИРОВАТЬ: вам нужна «схема» в uri, например «ftp: //» или «http: //»

Стивен Клири
источник
12

Лучше использовать Uri.IsWellFormedUriString(string uriString, UriKind uriKind). http://msdn.microsoft.com/en-us/library/system.uri.iswellformeduristring.aspx

Пример :-

 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
Это не решение. Он просто проверяет правильность URI, и если да, то продолжает.
Alexandru Dicu
8

Я решил обойти это, используя вместо этого UriBuilder .

UriBuilder builder = new UriBuilder(slct.Text);

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

источник
2

Для меня проблема заключалась в том, что когда я получил какое-то доменное имя, у меня было:

cloudsearch -..-..- xxx.aws.cloudsearch ... [НЕПРАВИЛЬНО]

http: //cloudsearch-..-..-xxx.aws.cloudsearch ... [ СПРАВА ]

надеюсь, что это сработает за вас :)

ПОЛУЧИТЬ ГАМЕР
источник