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.

Abatishchev
fonte
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);
CJBrew
fonte
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: //"

Simon
fonte
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: //"

Stephen Cleary
fonte
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);
        }
 }
Ashish Gupta
fonte
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))
{
   ...
}

fonte
2

O problema para mim foi que, quando recebi algum nome de domínio, eu tinha:

cloudsearch -..-..- xxx.aws.cloudsearch ... [ERRADO]

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

espero que isso funcione para você :)

WareN The GaMeR
fonte