SORU
12 Temmuz 2010, PAZARTESİ


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
12 Temmuz 2010, PAZARTESİ


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.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Eric Anthony

    Eric Anthony

    13 AĞUSTOS 2011
  • humanHardDrive

    humanHardDri

    16 Mart 2011
  • Sergio Lafuente Rubio

    Sergio Lafue

    11 Aralık 2008