Estoy creando un programa simple en visual c # 2005 que busca un símbolo bursátil en Yahoo! Finance, descarga los datos históricos y luego traza el historial de precios para el símbolo de cotización especificado.
Sé la URL exacta que necesito para adquirir los datos, y si el usuario ingresa un símbolo de cotización existente (o al menos uno con datos en Yahoo! Finance), funciona perfectamente bien. Sin embargo, tengo un error en tiempo de ejecución si el usuario crea un símbolo de cotización, ya que el programa intenta extraer datos de una página web que no existe.
Estoy usando la clase WebClient y la función DownloadString. Revisé todas las demás funciones miembro de la clase WebClient, pero no vi nada que pudiera usar para probar una URL.
¿Cómo puedo hacer esto?
fuente
Respuestas:
¿Podría emitir una solicitud "HEAD" en lugar de "GET"?
(editar) - ¡lol! ¡Parece que he hecho esto antes ! cambiado a wiki para evitar acusaciones de repetición. Entonces, para probar una URL sin el costo de descargar el contenido:
Debería
try
/catch
alrededor delDownloadString
para comprobar si hay errores; ¿No hay error? Existe...Con C # 2.0 (VS2005):
y
fuente
Aquí hay otra implementación de esta solución:
De: http://www.dotnetilstts.net/2009/10/14/how-to-check-remote-file-exists-using-c/
fuente
Estas soluciones son bastante buenas, pero olvidan que puede haber otros códigos de estado además de 200 OK. Esta es una solución que he usado en entornos de producción para monitorear el estado y demás.
Si hay una redirección de URL o alguna otra condición en la página de destino, la devolución será verdadera usando este método. Además, GetResponse () lanzará una excepción y, por lo tanto, no obtendrá un StatusCode para ella. Debe capturar la excepción y verificar un ProtocolError.
Cualquier código de estado 400 o 500 devolverá falso. Todos los demás vuelven verdaderos. Este código se modifica fácilmente para adaptarse a sus necesidades de códigos de estado específicos.
fuente
HttpWebRequest
no le gusta si no utiliza.Close()
elresponse
objeto antes de intentar descargar cualquier otra cosa. ¡Tomó horas encontrar ese!HttpWebResponse
El objeto debe estar encerrado en unusing
bloque ya que implementaIDisposable
lo que también asegurará el cierre de la conexión. Esto podría causar problemas como @jbeldock, ha enfrentado.Head
puede que no sea compatible con ese recurso, aunqueGet
podría serlo. Debería haber arrojado 405 en su lugar.Si entiendo tu pregunta correctamente, puedes usar un pequeño método como este para darte los resultados de tu prueba de URL:
Puede envolver el código anterior en un método y usarlo para realizar la validación. Espero que esto responda a la pregunta que estaba haciendo.
fuente
Pruebe esto (asegúrese de usar System.Net):
Cuando se llama a la función checkWebsite (), intenta obtener el código fuente de la URL que se le pasa. Si obtiene el código fuente, devuelve verdadero. Si no, devuelve falso.
Ejemplo de código:
fuente
Aqui hay otra opcion
fuente
Esta solución parece fácil de seguir:
fuente
fuente
Tengo una forma más sencilla de determinar si una URL es válida.
fuente
Siempre he encontrado que las excepciones son mucho más lentas de manejar.
¿Quizás una forma menos intensiva produciría un resultado mejor y más rápido?
Entonces solo usa:
fuente
Los servidores web responden con un código de estado HTTP que indica el resultado de la solicitud, por ejemplo, 200 (a veces 202) significa éxito, 404 - no encontrado, etc. (ver aquí ). Suponiendo que la parte de la dirección del servidor de la URL es correcta y no está obteniendo un tiempo de espera de socket, lo más probable es que la excepción le indique que el código de estado HTTP era distinto de 200. Sugeriría verificar la clase de la excepción y ver si la excepción se lleva el código de estado HTTP.
IIRC: la llamada en cuestión genera una WebException o un descendiente. Verifique el nombre de la clase para ver cuál y envuelva la llamada en un bloque try para capturar la condición.
fuente
Siguiendo los ejemplos ya dados, diría que es una buena práctica envolver también la respuesta en un uso como este
fuente