Domanda

C'è un modo semplice per ottenere il codice di stato HTTP da un System.Net.WebException?

È stato utile?

Soluzione

Forse qualcosa di simile ...

try
{
    // ...
}
catch (WebException ex)
{
    if (ex.Status == WebExceptionStatus.ProtocolError)
    {
        var response = ex.Response as HttpWebResponse;
        if (response != null)
        {
            Console.WriteLine("HTTP Status Code: " + (int)response.StatusCode);
        }
        else
        {
            // no http status code available
        }
    }
    else
    {
        // no http status code available
    }
}

Altri suggerimenti

Usando il null-condizionale operatore (?.) si può ottenere il codice di stato HTTP con una sola riga di codice:

 HttpStatusCode? status = (ex.Response as HttpWebResponse)?.StatusCode;

Il status variabile conterrà il HttpStatusCode . Quando l'c'è un fallimento più generale come un errore di rete in cui nessun codice di stato HTTP viene mai inviato quindi status sarà nullo. In questo caso è possibile ispezionare ex.Status per ottenere il WebExceptionStatus .

Se si desidera solo una stringa descrittiva per accedere in caso di guasto è possibile utilizzare la null-coalescenza operatore (??) per ottenere l'errore relativo:

string status = (ex.Response as HttpWebResponse)?.StatusCode.ToString()
    ?? ex.Status.ToString();

Se l'eccezione viene generata a seguito di un codice di stato HTTP 404 la stringa conterrà "NotFound". D'altra parte, se il server non è in linea la stringa conterrà "ConnectFailure" e così via.

  

(E per qualcuno che vuole sapere come ottenere il HTTP stato secondario   codice. Non è possibile. Si tratta di un concetto di Microsoft IIS che è solo   registrati sul server e mai inviato al client.)

questo funziona solo se WebResponse è un HttpWebResponse.

try
{
    ...
}
catch (System.Net.WebException exc)
{
    var webResponse = exc.Response as System.Net.HttpWebResponse;
    if (webResponse != null && 
        webResponse.StatusCode == System.Net.HttpStatusCode.Unauthorized)
    {
        MessageBox.Show("401");
    }
    else
        throw;
}

(mi rendo conto la questione è vecchio, ma è tra le prime visite per Google.)

Una situazione comune in cui si desidera conoscere il codice di risposta è nella gestione delle eccezioni. A partire dal C # 7, è possibile utilizzare il pattern matching in realtà per entrare solo la clausola catch se l'eccezione corrispondente al predicato:

catch (WebException ex) when (ex.Response is HttpWebResponse response)
{
     doSomething(response.StatusCode)
}

Questo può facilmente essere esteso per ulteriori livelli, come in questo caso in cui il WebException era in realtà l'eccezione interna di un altro (e siamo interessati solo a 404):

catch (StorageException ex) when (ex.InnerException is WebException wex && wex.Response is HttpWebResponse r && r.StatusCode == HttpStatusCode.NotFound)

Infine:. Si noti come non c'è bisogno di ri-generare l'eccezione nella clausola catch quando non corrisponde ai suoi criteri, dal momento che non si entra la clausola in primo luogo con la soluzione di cui sopra

Si può provare questo codice per ottenere il codice di stato HTTP da WebException. Funziona in Silverlight anche perché SL non ha WebExceptionStatus.ProtocolError definito.

HttpStatusCode GetHttpStatusCode(WebException we)
{
    if (we.Response is HttpWebResponse)
    {
        HttpWebResponse response = (HttpWebResponse)we.Response;
        return response.StatusCode;
    }
    return null;
}

Non sono sicuro se c'è, ma se ci fosse un tale proprietà non sarebbe considerato affidabile. Un WebException può essere licenziato per motivi diversi da HTTP codici di errore, tra cui gli errori di rete semplici. Coloro che non hanno tale corrispondente codice di errore HTTP.

Può darci un po 'più di informazioni su ciò che si sta cercando di realizzare con quel codice. Ci può essere un modo migliore per ottenere le informazioni di cui hai bisogno.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top