2012-04-10 51 views
31

Próbuję sprawdzić istnienie adresu URL za pomocą HttpWebRequest. Znalazłem kilka przykładów, które wykonują w zasadzie tak:Dlaczego HttpWebRequest zgłasza wyjątek zamiast zwracania HttpStatusCode.NotFound?

HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(Url); 
request.Method = "HEAD"; 
using (HttpWebResponse response = request.GetResponse() as HttpWebResponse) 
{ 
    return response.StatusCode; 
} 

Jednakże, jeśli adres URL jest rzeczywiście uszkodzony, to nie wraca odpowiedź, to zamiast rzucać wyjątek.

zmodyfikowałem mój kod do tego:

try 
{ 
    HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(Url); 
    request.Method = "HEAD"; 
    using (HttpWebResponse response = request.GetResponse() as HttpWebResponse) 
    { 
     return response.StatusCode; 
    } 
} 
catch (System.Net.WebException ex) 
{ 
    var response = ex.Response as HttpWebResponse; 
    return response == null ? HttpStatusCode.InternalServerError : response.StatusCode; 
} 

który wydaje się w końcu robić to, co chcę.

Ale chciałbym wiedzieć, dlaczego żądanie zgłasza wyjątek zamiast zwracania odpowiedzi z kodem statusu NotFound?

Odpowiedz

54

To może być dość denerwujące, gdy strony internetowe używają silnie kodów statusu i nie wszystkie z nich są błędami. Co może sprawić, że przetwarzanie ciała będzie bardzo trudne. Osobiście używam tej metody rozszerzenia, aby uzyskać odpowiedź.

public static class HttpWebResponseExt 
{ 
    public static HttpWebResponse GetResponseNoException(this HttpWebRequest req) 
    { 
     try 
     { 
      return (HttpWebResponse)req.GetResponse(); 
     } 
     catch (WebException we) 
     { 
      var resp = we.Response as HttpWebResponse; 
      if (resp == null) 
       throw; 
      return resp; 
     } 
    } 
} 
+6

Chociaż jest to najmniej pracy, aby zapisać kod przy użyciu HttpWebRequest/Response z tego złego wyboru projektu na stronie .Net Framework, poprawne rozwiązanie jest użycie HttpClient, który nie rzuca na kody statusu 4xx i 5xx. Wyjątki są przeznaczone na wyjątkowe sytuacje i rzucanie tylko po to, aby je złapać i postępować tak, jakby to było w porządku, ponieważ jest to brzydkie i złe dla wydajności, szczególnie biorąc pod uwagę lepszą opcję, która całkowicie go unika. https://msdn.microsoft.com/en-us/library/hh138242(v=vs.118).aspx –

+1

nie wydaje się to prawdą; Używam HttpClient w projekcie i podczas wywoływania adresu URL, który nie istnieje, który zwraca kod statusu 404, klient rzuca wyjątek zamiast zwracania odpowiedzi z kodem statusu 404. czy istnieje dodatkowy krok w korzystaniu z usługi httpclient, aby temu zapobiec? – SelAromDotNet

2

Dlaczego nie? Oba są poprawnymi opcjami projektowania, a HttpWebRequest został zaprojektowany tak, aby działał w ten sposób.

+0

Dopóki można przeczytać nagłówki odpowiedzi i ciało, gdy kod jest 4xx –

+4

Chyba był zdezorientowany, ponieważ żadna z próbek kodu widziałem za to wziął to pod uwagę. wielu nie miało nawet próby/catch i zastanawiałem się, czy może coś przeoczyłem i istnieje sposób na uzyskanie statusu bez wyrzucania wyjątku. wydaje się być sprzeczne z intuicją, aby rzucić cały wyjątek, jeśli kod statusu jest przeznaczony do obsługi takiego statusu. – SelAromDotNet

+1

Tak, zawsze prowadzi do interesujących wyników, gdy myślisz, że "oczywiście xxx przetestował linię kodu, którą umieścił na swojej stronie internetowej!" i okazuje się, że się mylisz :) –

Powiązane problemy