2015-10-04 17 views
13

Tôi đang phát triển ứng dụng bảng điều khiển C# để kiểm tra xem URL có hợp lệ hay không. Nó hoạt động tốt cho hầu hết các URL và có thể nhận phản hồi với Mã trạng thái HTTP từ trang web mục tiêu. Nhưng khi kiểm tra một số URL khác, ứng dụng sẽ ném "Đã xảy ra lỗi khi gửi yêu cầu" ngoại lệ khi chạy phương thức HttpClient.SendAsync. Vì vậy, tôi không thể nhận được bất kỳ phản hồi hoặc Mã trạng thái HTTP nào ngay cả khi URL này thực sự hoạt động trong trình duyệt. Tôi đang tuyệt vọng để tìm hiểu làm thế nào để xử lý trường hợp này. Nếu URL không hoạt động hoặc máy chủ từ chối yêu cầu của tôi, thì ít nhất nó sẽ cung cấp cho tôi mã trạng thái HTTP tương ứng.C# HttpClient.SendAsync ném "Đã xảy ra lỗi khi gửi yêu cầu" ngoại lệ khi kiểm tra một số URL

Dưới đây là mã đơn giản của ứng dụng thử nghiệm của tôi:

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) 
       { 
       } 
      } 
     } 

    } 
} 

Trả lời

8

Nếu bạn nhìn vào InnerException bạn sẽ thấy rằng:

"Cái tên từ xa có thể không được giải quyết: 'www. fc.edu '"

URL này cũng không hoạt động trên trình duyệt của tôi.

Để nhận phản hồi HTTP, bạn cần khách hàng có thể liên lạc với máy chủ (ngay cả để nhận được error 404) và trong trường hợp của bạn, lỗi xảy ra at the DNS level.

Một số trình duyệt có tính năng tự động hoàn thành cho các loại hình trường hợp nếu một URL cụ thể không được tìm thấy, trình duyệt thử lại với một hậu tố/tiền tố khác nhau, ví dụ:

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. 

Nhưng lưu ý rằng bạn có thể thay đổi mã của bạn từ:

catch (Exception e) 
{ 

} 

Để:

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

Và bạn sẽ có thể t o xem những gì gây ra lỗi của bạn.

Ngoài ra, Bạn không bao giờ nên muốn bắt generic Exception trừ khi ném đã ném các generic Exception, và thậm chí hơn, không bao giờ nắm bắt và không làm gì cả ngoại trừ, ít nhất là đăng nhập nó.

Chú ý hơn kể từ khi bạn chờ đợi chỉ cho rằng một trong những nhiệm vụ bạn có thể sử dụng:

urlTester.RunTestAsync().Wait(); 

Thay vì:

Task.WhenAll(urlTester.RunTestAsync()); 

Task.WhenAll tạo ra một mới Task khi trao Task s được hoàn thành. trong trường hợp của bạn, bạn cần Task.WaitAll hoặc Task.WhenAll(...).Wait().

+0

Nói chung, 'Tác vụ.WhenAll' sẽ trả về một số chờ đợi cần được chờ đợi. Nếu anh ta muốn phiên bản chặn, 'Task.WaitAll' là những gì anh ta nên sử dụng. –

+1

Bạn đã viết điều này chỉ khi tôi hoàn tất chỉnh sửa :) –

+0

Cảm ơn @TamirVered và Yuval Itzchakov đã giúp tôi tìm ra các chi tiết về ngoại lệ và cải thiện mã của tôi. Bây giờ câu hỏi trở nên như thế nào tôi có thể biết liệu URL này có hoạt động hay không khi vấn đề cấp DNS này xảy ra. Bởi vì trong nhiều trường hợp, URL thực sự hoạt động. Kiểm tra phần URL được thử nghiệm, tôi vừa thêm trường hợp này. – raycode

Các vấn đề liên quan