2012-03-01 20 views
9

Piszę aplikację, aby sprawdzić stan niektórych wewnętrznych aplikacji internetowych. Niektóre z tych aplikacji korzystają z uwierzytelniania systemu Windows. Kiedy używam tego kodu, aby sprawdzić status, rzuca The remote server returned an error: (401) Unauthorized.. Co jest zrozumiałe, ponieważ nie dostarczyłem żadnych danych uwierzytelniających do strony, więc nie mam upoważnienia.
Jak zignorować 401 nieautoryzowany błąd z web-quaest, aby uzyskać status strony internetowej

WebResponse objResponse = null; 
WebRequest objRequest = HttpWebRequest.Create(website); 
objResponse = objRequest.GetResponse(); 


Czy istnieje sposób zignorować błąd 401 nie robiąc coś takiego?

WebRequest objRequest = HttpWebRequest.Create(website); 

try 
{ 
    objResponse = objRequest.GetResponse(); 
} 
catch (WebException ex) 
{ 
    //Catch and ignore 401 Unauthorized errors because this means the site is up, the app just doesn't have authorization to use it. 
    if (!ex.Message.Contains("The remote server returned an error: (401) Unauthorized.")) 
    { 
     throw; 
    }      
} 
+0

Co masz na myśli mówiąc "ignoruj", przejdź do następnej strony? –

+1

Prawdopodobnie nie pomoże to w ogóle w przypadku wyjątku, ale powinieneś wykonać polecenie HEAD, ponieważ jest ono lżejsze i dobrze radzi sobie z tą sytuacją. –

+0

@HenkHolterman Właściwość, która powoduje, że webrequest nie rzuca wyjątku lub po prostu przełamuje wyjątek taki jak powyżej. – guanome

Odpowiedz

3

Gdy serwer jest wyłączony lub nieosiągalny dostaniesz wyjątek limit czasu. Wiem, że jedynym sposobem, aby sobie z tym poradzić, jest próba/catch.

Jestem całkiem pewien, że tak jest w przypadku większości błędów (401/404/501), więc: Nie, nie można ignorować (zapobiegać) wyjątków, ale trzeba będzie sobie z nimi poradzić. Są to jedyny sposób na uzyskanie większości kodów statusu, których szuka Twoja aplikacja.

2

W skrócie należy sprawdzić myHttpWebResponse.StatusCode dla kodu statusu i podjąć odpowiednie działania.

Przykładowy kod z reference:

public static void GetPage(String url) 
    { 
     try 
      { 
       // Creates an HttpWebRequest for the specified URL. 
       HttpWebRequest myHttpWebRequest = (HttpWebRequest)WebRequest.Create(url); 
       // Sends the HttpWebRequest and waits for a response. 
       HttpWebResponse myHttpWebResponse = (HttpWebResponse)myHttpWebRequest.GetResponse(); 
       if (myHttpWebResponse.StatusCode == HttpStatusCode.OK) 
        Console.WriteLine("\r\nResponse Status Code is OK and StatusDescription is: {0}", 
             myHttpWebResponse.StatusDescription); 
       // Releases the resources of the response. 
       myHttpWebResponse.Close(); 

      } 
     catch(WebException e) 
      { 
       Console.WriteLine("\r\nWebException Raised. The following error occured : {0}",e.Status); 
      } 
     catch(Exception e) 
     { 
      Console.WriteLine("\nThe following Exception was raised : {0}",e.Message); 
     } 
    } 
+2

Wyjątek jest zgłaszany w 'objResponse = objRequest.GetResponse();', więc nie mogę sprawdzić odpowiedzi, ponieważ odpowiedź nigdy nie zostanie ustawiona. Jeśli masz na myśli wyjątek, da mi on "ProtocolError", więc nadal będę musiał przesłuchać komunikat wyjątku, aby zobaczyć, jaki był kod statusu. – guanome

18

Proponuję spróbować tego:

 try 
     { 
      objResponse = objRequest.GetResponse() as HttpWebResponse; 
     } 
     catch (WebException ex) 
     { 
      objResponse = ex.Response as HttpWebResponse; 
     } 
     finally 

WebException ma odpowiedzi wszystkie informacje, które chcesz.

Powiązane problemy