Saya membuat program sederhana dalam visual c # 2005 yang mencari simbol saham di Yahoo! Keuangan, unduh data historis, lalu plot riwayat harga untuk simbol ticker yang ditentukan.
Saya tahu URL persis yang saya perlukan untuk memperoleh data, dan jika pengguna memasukkan simbol ticker yang ada (atau setidaknya satu dengan data di Yahoo! Finance), itu berfungsi dengan baik. Namun, saya mengalami error run-time jika pengguna membuat simbol ticker, karena program mencoba menarik data dari halaman web yang tidak ada.
Saya menggunakan kelas WebClient, dan menggunakan fungsi DownloadString. Saya memeriksa semua fungsi anggota lain dari kelas WebClient, tetapi tidak melihat apa pun yang dapat saya gunakan untuk menguji URL.
Bagaimana saya bisa melakukan ini?
sumber
Jawaban:
Anda bisa mengeluarkan permintaan "HEAD" daripada "GET"?
(edit) - lol! Sepertinya saya pernah melakukan ini sebelumnya !; diubah ke wiki untuk menghindari tuduhan pengumpulan ulang. Jadi untuk menguji URL tanpa biaya mengunduh konten:
Anda akan
try
/catch
sekitarDownloadString
untuk memeriksa kesalahan; tidak ada kesalahan? Itu ada ...Dengan C # 2.0 (VS2005):
dan
sumber
Berikut adalah implementasi lain dari solusi ini:
Dari: http://www.dotnetthoughts.net/2009/10/14/how-to-check-remote-file-exists-using-c/
sumber
Solusi ini cukup bagus, tetapi mereka lupa bahwa mungkin ada kode status selain 200 OK. Ini adalah solusi yang saya gunakan di lingkungan produksi untuk pemantauan status dan semacamnya.
Jika ada pengalihan url atau beberapa kondisi lain pada halaman target, pengembaliannya akan benar menggunakan metode ini. Selain itu, GetResponse () akan mengeluarkan pengecualian dan karenanya Anda tidak akan mendapatkan Kode Status untuk itu. Anda perlu menjebak pengecualian dan memeriksa ProtocolError.
Kode status 400 atau 500 akan mengembalikan false. Semua yang lain membalas dengan benar. Kode ini mudah dimodifikasi agar sesuai dengan kebutuhan Anda akan kode status tertentu.
sumber
HttpWebRequest
tidak suka jika Anda tidak.Close()
memilikiresponse
objek sebelum Anda mencoba mengunduh yang lain. Butuh waktu berjam-jam untuk menemukan yang satu itu!HttpWebResponse
objek harus diapit dalamusing
blok karena diimplementasikanIDisposable
yang juga akan memastikan penutupan koneksi. Ini mungkin menyebabkan masalah seperti yang dihadapi @jbeldock.Head
mungkin tidak didukung pada sumber daya itu meskipunGet
mungkin saja. Seharusnya malah melempar 405.Jika saya memahami pertanyaan Anda dengan benar, Anda dapat menggunakan metode kecil seperti ini untuk memberikan hasil tes URL Anda:
Anda dapat membungkus kode di atas dalam sebuah metode dan menggunakannya untuk melakukan validasi. Saya harap ini menjawab pertanyaan yang Anda ajukan.
sumber
Coba ini (Pastikan Anda menggunakan System.Net):
Ketika fungsi checkWebsite () dipanggil, ia mencoba untuk mendapatkan kode sumber dari URL yang diteruskan ke dalamnya. Jika mendapat kode sumber, itu mengembalikan true. Jika tidak, itu mengembalikan salah.
Contoh Kode:
sumber
Ini opsi lain
sumber
Solusi ini tampaknya mudah diikuti:
sumber
sumber
Saya memiliki cara yang lebih sederhana untuk menentukan apakah url valid.
sumber
Saya selalu menemukan bahwa Pengecualian jauh lebih lambat untuk ditangani.
Mungkin dengan cara yang kurang intensif kamu akan mendapatkan hasil yang lebih baik, lebih cepat,?
Kemudian gunakan saja:
sumber
Server web merespon dengan kode status HTTP yang menunjukkan hasil dari permintaan misalnya 200 (terkadang 202) berarti sukses, 404 - tidak ditemukan dll (lihat di sini ). Dengan asumsi bagian alamat server dari URL benar dan Anda tidak mendapatkan batas waktu soket, pengecualian kemungkinan besar memberi tahu Anda kode status HTTP selain 200. Saya akan menyarankan untuk memeriksa kelas pengecualian dan melihat apakah pengecualian tersebut membawa kode status HTTP.
IIRC - Panggilan yang dimaksud akan menampilkan WebException atau turunan. Periksa nama kelas untuk melihat yang mana dan gabungkan panggilan dalam blok percobaan untuk menjebak kondisi.
sumber
Mengikuti dari contoh yang sudah diberikan, saya akan mengatakan, praktik terbaik juga membungkus respons dalam penggunaan seperti ini
sumber