Try-catch daha?C URL doğrulamak için daha iyi bir yol#
İnternetten bir resim almasını için bir uygulama inşa ediyorum. Gayet iyi çalışıyor olsa bile, kullanmayı deneyin-catch uygulamasında ifadeleri yavaş (yanlış verilen URL).
(1) En iyi yol bu URL doğrulamak ve yanlış giriş işlemek için veya Düzenli ifade (veya başka bir yöntem) yerine kullanmalıyım?
(2) Neden uygulama görüntüleri yerel olarak bulursanız deneyin http:// textBox belirtmek değil mi?
private void btnGetImage_Click(object sender, EventArgs e)
{
String url = tbxImageURL.Text;
byte[] imageData = new byte[1];
using (WebClient client = new WebClient())
{
try
{
imageData = client.DownloadData(url);
using (MemoryStream ms = new MemoryStream(imageData))
{
try
{
Image image = Image.FromStream(ms);
pbxUrlImage.Image = image;
}
catch (ArgumentException)
{
MessageBox.Show("Specified image URL had no match",
"Image Not Found", MessageBoxButtons.OK,
MessageBoxIcon.Error);
}
}
}
catch (ArgumentException)
{
MessageBox.Show("Image URL can not be an empty string",
"Empty Field", MessageBoxButtons.OK,
MessageBoxIcon.Information);
}
catch (WebException)
{
MessageBox.Show("Image URL is invalid.\nStart with http:// "
"and end with\na proper image extension", "Not a valid URL",
MessageBoxButtons.OK, MessageBoxIcon.Information);
}
} // end of outer using statement
} // end of btnGetImage_Click
Zaman ayırdığınız için teşekkürler!
DÜZENLEME:
Panagiotis Kanavos tarafından önerilen çözüm (çaba için teşekkür ederiz!), denedim ama sadece kullanıcı http://
girer ve bir şey daha, Eğer if-else deyimi yakalanmış olur. Değişen UriKind.Mutlak yakalar gibi dizeleri boş! Yaklaşıyor :)
Kodu şimdi olduğu gibi:
private void btnGetImage_Click(object sender, EventArgs e)
{
String url = tbxImageURL.Text;
byte[] imageData = new byte[1];
Uri myUri;
// changed to UriKind.Absolute to catch empty string
if (Uri.TryCreate(url, UriKind.Absolute, out myUri))
{
using (WebClient client = new WebClient())
{
try
{
imageData = client.DownloadData(myUri);
using (MemoryStream ms = new MemoryStream(imageData))
{
imageData = client.DownloadData(myUri);
Image image = Image.FromStream(ms);
pbxUrlImage.Image = image;
}
}
catch (ArgumentException)
{
MessageBox.Show("Specified image URL had no match",
"Image Not Found", MessageBoxButtons.OK,
MessageBoxIcon.Error);
}
catch (WebException)
{
MessageBox.Show("Image URL is invalid.\nStart with http:// "
"and end with\na proper image extension",
"Not a valid URL",
MessageBoxButtons.OK, MessageBoxIcon.Information);
}
}
}
else
{
MessageBox.Show("The Image Uri is invalid.\nStart with http:// "
"and end with\na proper image extension", "Uri was not created",
MessageBoxButtons.OK, MessageBoxIcon.Information);
}
Burada bir yanlışlık yapıyor olmalıyım :(
CEVAP
Uri.TryCreate eğer url dizesi geçerli bir URL ise sadece Uri, yeni bir nesne oluşturmak için kullanın. Eğer dize geçerli bir URL değil, TryCreate false değerini döndürür.
string myString = "http://someUrl";
Uri myUri;
if (Uri.TryCreate(myString, UriKind.RelativeOrAbsolute, out myUri))
{
//use the uri here
}
GÜNCELLEME
Ya Urı kurucu mutlu geçersiz, örneğin görünebilir dizeleri kabul eder TryCreate "ev sahibi","ev sahibi:" ya da "chrome:" hakkında. www.stackoverflow.com www.stackoverflow.com Aslında, bu son derece geçerli olan özel bir URI şeması belirtmek yerine". http
Uri.Scheme mülkiyet belgeleri gibi örnekler sağlar "gopher: (herkes bunu hatırlıyor musun?)", "haber", "", "". uuıd mailto
Bir uygulama How do I register a custom URL protocol in Windows? örneğin, özel bir protokolü MSDN açıklandığı gibi işleyicisi veya diğer soru olarak kendini kayıt olabilirler
TryCreate belirli düzenleri kendini kısıtlamak için bir yol sağlamaz. Kodu Urı kontrol etmesi gerekecek.Scheme özelliği kabul edilebilir bir değer içerir sağlamak için
GÜNCELLEME 2
"></script><script>alert(9)</script>
gibi garip bir dize gönderme true
iade ve göreli Urı bir nesne inşa edecek. Uri.IsWellFormedOriginalString arama yanlış olsa da geri dönecek. Muhtemelen göreli URI iyi biçimlendirilmiş olduğundan emin olmak istiyorsanız, IsWellFormedOriginalString
demek zorunda.
Diğer taraftan, UriKind.Absolute
10 *çağıran bu durumda yanlış döndürür.
İlginçtir, Uri.İsWellFormedUriString aramalar dahili TryCreate ve göreli Urı oluşturulmuşsa IsWellFormedOriginalString
değerini döndürür.
Nasıl daha sonra düz metin alma için e...
Nasıl div içeriğini daha büyük değil y...
Toplu N günden daha eski dosyaları sil...
2 tarafından bir tamsayı bölme için ku...
Nasıl daha az (gnu) satır numaralarını...