Недействительный 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? Это обычный текст.


Он сообщает мне, что содержимое 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);

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))
{
   ...
}

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.