URI inválido: o formato do URI não pôde ser determinado


115

Eu continuo recebendo esse erro.

URI inválido: o formato do URI não pôde ser determinado.

o código que tenho é:

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

Update: o conteúdo em slct.Text é ftp.jt-software.net/style.css.

O que da? Como isso não é um formato de URI válido? É um texto simples.


Ele está me informando que o conteúdo de slct.Text não é um Uri válido. Mas isso é.

1
@jts: você poderia postar o URI ofensivo, talvez?
Mitch Wheat

Você obtém uma exceção ao criar o Uri com o novo Uri ou ao tentar excluir o arquivo no servidor?
Simon

2
o uri ofensivo é: ftp.jt-software.net/style.css

2
@jts, presumo que os votos negativos vieram das pessoas que deixaram um comentário e descobriram que você não atualizou sua resposta. Observe, você pode editar sua pergunta para torná-la completa (e aceitar respostas), para mantê-la limpa. Você estava faltando ftp://ou http://em seu URI. Você tem o meu voto agora ;-)
Abel

Respostas:


126

Pode ser útil usar um construtor diferente para Uri.

Se você tem o nome do servidor

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

e ter um caminho Uri relativo para anexar a ele, por exemplo

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

Ao criar um Uri a partir desses dois, obtenho a exceção "não foi possível determinar o formato", a menos que use o construtor com o argumento UriKind, ou seja,

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

Verifique os possíveis motivos aqui: http://msdn.microsoft.com/en-us/library/z6c2z492(v=VS.100).aspx

EDITAR:

Você precisa colocar o prefixo do protocolo antes do endereço, ou seja, no seu caso, "ftp: //"


3
Absolutamente nada de errado. Eu estava fazendo tudo muito rápido e acidentalmente cliquei no botão para baixo e ele dizia que, a menos que a pergunta seja editada, eu não posso desfazê-la, então, se você puder editar sua pergunta ou algo assim, posso votar novamente :) sobre isso :-( Não tive a

votando contra em vez de jts. Uma vez que este último desapareceu :)
Andy

1
@Simon, acabei de votar em você UP novamente, desculpe pelo atraso ENORME! Você pode me dar um soco 2 vezes lol

13

Parece que pode ser um uri real. Eu tive esse problema ao fazer cross-browser Silverlight; no meu blog , mencionei uma solução alternativa: passe um uri de "contexto" como o primeiro parâmetro.

Se o uri for realtivo, o uri de contexto será usado para criar um uri completo. Se o uri for absoluto, o uri de contexto será ignorado.

EDIT: Você precisa de um "esquema" no uri, por exemplo, "ftp: //" ou "http: //"


12

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

Exemplo: -

 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
Isso não fornece uma solução. Ele apenas verifica se o URI está correto e, em caso afirmativo, continua.
Alexandru Dicu 01 de

8

Eu contornei isso usando o UriBuilder .

UriBuilder builder = new UriBuilder(slct.Text);

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

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.