2015-10-04 21 views
13

Bir URL'nin geçerli olup olmadığını veya çalışıp çalışmadığını sınamak için bir C# konsol uygulaması geliştiriyorum. Çoğu URL için iyi çalışır ve hedef web sitesinden HTTP Durum Kodu ile yanıt alabilirsiniz. Ancak, diğer bazı URL'leri test ederken, HttpClient.SendAsync yöntemini çalıştırırken uygulama "İstek gönderilirken bir hata oluştu" özel durumu oluşturur. Bu yüzden, herhangi bir yanıt alamıyorum veya HTTP Durum Kodu, bu URL aslında tarayıcıda çalışır. Bu davayı nasıl ele alacağımı öğrenmek için çaresizim. URL çalışmıyorsa veya sunucu isteğimi reddediyorsa, en azından bana karşılık gelen HTTP Durum kodunu vermelidir. Eğer InnerException bakarsakC# HttpClient.SendAsync atıyor "Bazı URL'leri test ederken istisna istek gönderilirken bir hata oluştu"

using System; 
using System.Net.Http; 
using System.Threading.Tasks; 

namespace TestUrl 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      // var urlTester = new UrlTester("http://www.sitename.com/wordpress"); // works well and get 404 
      // var urlTester = new UrlTester("http://www.fc.edu/"); // Throw exception and the URL doesn't work 
      var urlTester = new UrlTester("http://www.ntu.edu.tw/english/"); // Throw exception and the URL works actually 

      Console.WriteLine("Test is started"); 

      Task.WhenAll(urlTester.RunTestAsync()); 

      Console.WriteLine("Test is stoped"); 
      Console.ReadKey(); 
     } 


     public class UrlTester 
     { 
      private HttpClient _httpClient; 
      private string _url; 

      public UrlTester(string url) 
      { 
       _httpClient = new HttpClient(); 
       _url = url; 
      } 

      public async Task RunTestAsync() 
      { 
       var httpRequestMsg = new HttpRequestMessage(HttpMethod.Head, _url); 

       try 
       { 
        using (var response = await _httpClient.SendAsync(httpRequestMsg, HttpCompletionOption.ResponseHeadersRead)) 
        { 
         Console.WriteLine("Response: {0}", response.StatusCode); 
        } 
       } 
       catch (Exception e) 
       { 
       } 
      } 
     } 

    } 
} 

cevap

8

bunu göreceksiniz:

"uzaktan adı çözülemedi: 'www İşte

benim test uygulamasının basitleştirilmiş kod bulunmaktadır. fc.edu '"

Bu URL tarayıcıda da çalışmıyor.

Bir HTTP yanıtı almak için, sunucuyla iletişim kurabilmesi için istemciye ihtiyacınız vardır (error 404 almak için bile) ve durumda hata at the DNS level oluştu.

try "x" 
if didn't work, try "www." + x 
if this didn't work try "www." + x + ".com" 
if this didn't work try "www." + x + ".net" 
if this didn't work try "www." + x + "." + currentRegionSuffix. 

Ama değiştirebileceğinizi unutmayın:

Bazı tarayıcılar

örneğin belirli bir URL bulunmazsa, tarayıcı farklı bir eki/öneki ile yeniden dener durumlarda bu tür otomatik tamamlama var kodunuzu gelen:

catch (HttpRequestException e) 
{ 
    Console.WriteLine(e.InnerException.Message); 
} 

Ve mümkün t olacak:

catch (Exception e) 
{ 

} 

için hatanın nedenini gör.

Ayrıca Sen atıcı jenerik Exception atılmış ve hatta daha vardır sürece genel Exception yakalamak en azından bunu günlük yakalamak ve hariç hiçbir şey yapmak asla istemem gerekir. Eğer kullanabileceği bir görev için sadece bekleyin çünkü daha

Uyarı: Yerine

urlTester.RunTestAsync().Wait(); 

: Verilen Task s tamamlandığında

Task.WhenAll(urlTester.RunTestAsync()); 

Task.WhenAll yeni Task oluşturur. senin durumda Task.WaitAll veya Task.WhenAll(...).Wait()gerekir.

+0

Genel olarak, 'Task.WhenAll' beklenilmesi gereken bir bekleyişi geri getirecektir. Engelleme sürümünü istiyorsa, 'Task.WaitAll' kullanması gereken şeydir. –

+1

Düzenlemeyi tamamladığımda bunu yazdınız :) –

+0

Teşekkür ederiz @TamirVered ve Yuval Itzchakov istisnanın ayrıntılarını bulmamda ve kodumu geliştirmeme yardımcı oluyor. Şimdi soru, bu DNS düzeyi sorunu olduğunda bu URL'nin çalışıp çalışmadığını nasıl anlayabilirim. Çoğu durumda, URL aslında çalışır. Test edilen URL bölümüne bakın, bu davayı yeni ekledim. – raycode

İlgili konular