5

Jak wykryć, że błąd WebRequest nie powiodło się z powodu błędu serwera proxy sieci Web, a nie błędu docelowego serwera WWW?Wykryj błąd serwera proxy HTTP dla WebRequest

try 
{ 
    var request = (HttpWebRequest)WebRequest.Create("http://www.example.com"); 
    request.Proxy = new WebProxy("localhost"); 
    var response = request.GetResponse(); 

    return response.GetResponseStream(); 
} 
catch(WebException webex) 
{ 
    //Detect proxy failure 
} 

Odpowiedz

3

Trudno. Oto kilka sugestii:

  • Właściwość webex.Response.ResponseUri zawiera identyfikator URI serwera proxy zamiast serwera, z którym próbowano się skontaktować.
  • Właściwość to taka, która zawsze odnosi się do problemu z serwerem proxy, np. ProxyAuthenticationRequired. Niestety większość stanów może odnosić się do błędu serwera proxy lub błędu serwera.
  • Kolekcja webex.Response.Headers zawiera niestandardowe wpisy, które rozpoznajesz jako generowane przez serwer proxy. Na przykład serwer proxy Squid zwraca nagłówek "X-Squid-Error", z własnym zastrzeżonym zestawem statusów.
  • Strumień webex.Response.ResponseStream zawiera komunikat o błędzie HTML lub zwykły tekst w formacie rozpoznawanym przez serwer proxy. Możesz przetestować, czy zawiera on identyfikator URI serwera proxy.

W swoim bloku blokowania upewnij się, że logujesz wszystkie szczegóły obiektu WebException, w tym wszystkie właściwości wymienione powyżej. Następnie można przeanalizować dane dziennika i opracować dokładny test na błędy proxy.

1

Myślę, że można złapać InvalidOperationException, a następnie sprawdzić komunikat "proxy".

Komunikat powiedziałby:

Nazwa proxy nie może być rozwiązany: 'localhost'

+0

Tak, sprawdzanie konkretnych słów kluczowych, takich jak "proxy" lub rzeczywisty adres proxy w komunikacie o wyjątku, byłoby wyborem, ale szukałem czegoś "bardziej deterministycznego". – AlexMinza

+0

Tak, to nie jest najmilsze podejście, jednak rzuca wyjątek InvalidOperationException , a zatem nie zapewniam Ci zbyt wiele! –

Powiązane problemy