Estou criando um programa simples em visual c # 2005 que procura um símbolo de ação no Yahoo! Finanças, baixa os dados históricos e, a seguir, plota o histórico de preços para o símbolo de ação especificado.
Sei a URL exata de que preciso para adquirir os dados e, se o usuário inserir um símbolo de ação existente (ou pelo menos um com dados no Yahoo! Finance), ele funcionará perfeitamente. No entanto, eu tenho um erro de tempo de execução se o usuário inventar um símbolo de ação, enquanto o programa tenta extrair dados de uma página da web inexistente.
Estou usando a classe WebClient e a função DownloadString. Examinei todas as outras funções de membro da classe WebClient, mas não vi nada que pudesse usar para testar um URL.
Como posso fazer isso?
fonte
Respostas:
Você poderia emitir uma solicitação "HEAD" em vez de "GET"?
(editar) - lol! Parece que já fiz isso antes !; alterado para wiki para evitar acusações de rep-grupamento. Portanto, para testar um URL sem o custo de baixar o conteúdo:
Você faria
try
/catch
ao redor doDownloadString
para verificar se há erros; nenhum erro? Isso existe...Com C # 2.0 (VS2005):
e
fonte
Aqui está outra implementação desta solução:
De: http://www.dotnetthoughts.net/2009/10/14/how-to-check-remote-file-exists-using-c/
fonte
Essas soluções são muito boas, mas eles se esquecem de que pode haver outros códigos de status além de 200 OK. Esta é uma solução que usei em ambientes de produção para monitoramento de status e tal.
Se houver um redirecionamento de url ou alguma outra condição na página de destino, o retorno será verdadeiro usando este método. Além disso, GetResponse () lançará uma exceção e, portanto, você não obterá um StatusCode para ela. Você precisa interceptar a exceção e verificar se há um ProtocolError.
Qualquer código de status 400 ou 500 retornará falso. Todos os outros retornam verdadeiros. Este código é facilmente modificado para atender às suas necessidades de códigos de status específicos.
fonte
HttpWebRequest
não gosto se você não pegar.Close()
oresponse
objeto antes de tentar baixar qualquer outra coisa. Demorou horas para encontrar aquele!HttpWebResponse
objeto deve ser colocado em umusing
bloco, uma vez que implementa oIDisposable
que também irá garantir o fechamento da conexão. Isso pode causar problemas como @jbeldock enfrentou.Head
pode não ser compatível com esse recurso, emboraGet
possa ser. Deveria ter lançado 405 em vez disso.Se entendi sua pergunta corretamente, você poderia usar um pequeno método como este para fornecer os resultados do seu teste de URL:
Você pode envolver o código acima em um método e usá-lo para realizar a validação. Espero que isso responda à pergunta que você estava fazendo.
fonte
Tente isto (certifique-se de usar System.Net):
Quando a função checkWebsite () é chamada, ela tenta obter o código-fonte do URL passado para ela. Se obtiver o código-fonte, ele retorna verdadeiro. Caso contrário, ele retorna falso.
Exemplo de código:
fonte
Aqui está outra opção
fonte
Esta solução parece fácil de seguir:
fonte
fonte
Eu tenho uma maneira mais simples de determinar se um url é válido.
fonte
Sempre descobri que as exceções são muito mais lentas para serem tratadas.
Talvez uma forma menos intensiva produzisse um resultado melhor e mais rápido?
Depois é só usar:
fonte
Os servidores da Web respondem com um código de status HTTP indicando o resultado da solicitação, por exemplo, 200 (às vezes 202) significa sucesso, 404 - não encontrado etc (veja aqui ). Supondo que a parte do endereço do servidor da URL esteja correta e você não esteja obtendo um tempo limite de soquete, a exceção provavelmente está informando que o código de status HTTP era diferente de 200. Eu sugeriria verificar a classe da exceção e ver se ela carrega o código de status HTTP.
IIRC - A chamada em questão lança uma WebException ou um descendente. Verifique o nome da classe para ver qual deles e envolva a chamada em um bloco try para interceptar a condição.
fonte
Seguindo com os exemplos já fornecidos, eu diria que é uma prática recomendada também envolver a resposta em um uso como este
fonte