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?
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 –
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