Tworzę prosty program w Visual C # 2005, który wyszukuje symbol giełdowy na Yahoo! Finance, pobiera dane historyczne, a następnie wykreśla historię cen dla określonego symbolu giełdowego.
Znam dokładny adres URL, którego potrzebuję, aby uzyskać dane, a jeśli użytkownik wprowadzi istniejący symbol giełdowy (lub przynajmniej jeden z danymi w Yahoo! Finance), działa to doskonale. Jednak pojawia się błąd w czasie wykonywania, jeśli użytkownik tworzy symbol giełdowy, ponieważ program próbuje pobrać dane z nieistniejącej strony internetowej.
Używam klasy WebClient i funkcji DownloadString. Przejrzałem wszystkie inne funkcje składowe klasy WebClient, ale nie znalazłem niczego, czego mógłbym użyć do przetestowania adresu URL.
W jaki sposób mogę to zrobić?
źródło
Odpowiedzi:
Możesz wysłać żądanie „HEAD” zamiast „GET”?
(edytuj) - lol! Wygląda na to, że robiłem to wcześniej ! zmieniono na wiki, aby uniknąć oskarżeń o zbieranie reputacji. Aby więc przetestować adres URL bez kosztów pobierania treści:
Będziesz
try
/catch
wokół,DownloadString
aby sprawdzić błędy; żaden błąd? Istnieje...W języku C # 2.0 (VS2005):
i
źródło
Oto kolejna realizacja tego rozwiązania:
Od: http://www.dotnethardts.net/2009/10/14/how-to-check-remote-file-exists-using-c/
źródło
Te rozwiązania są całkiem dobre, ale zapominają, że mogą istnieć inne kody stanu niż 200 OK. Jest to rozwiązanie, którego używałem na środowiskach produkcyjnych do monitorowania statusu i tym podobnych.
Jeśli na stronie docelowej znajduje się przekierowanie adresu URL lub inny warunek, zwrot przy użyciu tej metody będzie prawdziwy. Ponadto GetResponse () zgłosi wyjątek i dlatego nie otrzymasz dla niego StatusCode. Musisz przechwycić wyjątek i sprawdzić ProtocolError.
Każdy kod statusu 400 lub 500 zwróci fałsz. Wszyscy inni zwracają prawdę. Ten kod można łatwo zmodyfikować, aby dopasować go do potrzeb dotyczących określonych kodów statusu.
źródło
HttpWebRequest
nie podoba, jeśli NIE.Close()
tenresponse
obiekt, zanim spróbujesz ściągnąć cokolwiek innego. Znalezienie tego zajęło wiele godzin!HttpWebResponse
obiekt powinien być zamknięty wusing
bloku, ponieważ realizujeIDisposable
co również zapewni zamknięcie połączenia. Może to powodować problemy, przed którymi stanął @jbeldock.Head
nie być obsługiwany przez ten zasób, chociażGet
może być. Zamiast tego powinien wyrzucić 405.Jeśli dobrze zrozumiem Twoje pytanie, możesz skorzystać z małej metody, takiej jak ta, aby uzyskać wyniki testu adresu URL:
Możesz zawinąć powyższy kod w metodę i użyć go do przeprowadzenia walidacji. Mam nadzieję, że to odpowiada na pytanie, które zadałeś.
źródło
Spróbuj tego (upewnij się, że używasz System.Net):
Gdy wywoływana jest funkcja checkWebsite (), próbuje ona pobrać kod źródłowy przekazanego do niej adresu URL. Jeśli otrzyma kod źródłowy, zwraca wartość true. Jeśli nie, zwraca false.
Przykład kodu:
źródło
Oto inna opcja
źródło
To rozwiązanie wydaje się łatwe do naśladowania:
źródło
źródło
mam prostszy sposób na sprawdzenie, czy adres URL jest prawidłowy.
źródło
Zawsze uważałem, że wyjątki są znacznie wolniejsze w obsłudze.
Być może mniej intensywny sposób przyniósłby lepszy i szybszy wynik?
Następnie po prostu użyj:
źródło
Serwery WWW odpowiadają kodem statusu HTTP wskazującym wynik żądania, np. 200 (czasami 202) oznacza sukces, 404 - nie znaleziono itp. (Patrz tutaj ). Zakładając, że część adresu URL zawierająca adres serwera jest poprawna i nie otrzymujesz limitu czasu gniazda, najprawdopodobniej wyjątek mówi, że kod statusu HTTP był inny niż 200. Sugerowałbym sprawdzenie klasy wyjątku i sprawdzenie, czy wyjątek przenosi kod stanu HTTP.
IIRC - wywołanie w pytaniu zgłasza WebException lub element podrzędny. Sprawdź nazwę klasy, aby zobaczyć, która z nich i zawiń wywołanie blokiem try, aby przechwycić warunek.
źródło
Kontynuując już podane przykłady, powiedziałbym, że najlepszą praktyką jest zawinięcie odpowiedzi w taki sposób
źródło