C'è un modo semplice per ottenere il codice di stato HTTP da un System.Net.WebException
?System.Net.WebException codice di stato HTTP
risposta
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
}
}
non sono sicuro se c'è, ma se ci fosse una tale proprietà, non sarebbe considerato affidabile. Un WebException
può essere attivato per motivi diversi dai codici di errore HTTP inclusi semplici errori di rete. Quelli non hanno tale codice di errore http corrispondente.
puoi darci un po 'più di informazioni su ciò che si sta cercando di realizzare con quel codice. Potrebbe esserci un modo migliore per ottenere le informazioni di cui hai bisogno.
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;
}
perché trattare solo con 401-Unauthorized invece di tutti i possibili codici di stato di errore HTTP? questa è la risposta peggiore – ympostor
@ympostor Questo è solo un esempio. Qualsiasi sviluppatore ragionevole lo capisce. Il tuo commento è il più spensierato che abbia mai letto qui. – pr0gg3r
È possibile provare questo codice per ottenere il codice di stato HTTP da WebException. Funziona anche in Silverlight perché SL non ha definito WebExceptionStatus.ProtocolError.
HttpStatusCode GetHttpStatusCode(WebException we)
{
if (we.Response is HttpWebResponse)
{
HttpWebResponse response = (HttpWebResponse)we.Response;
return response.StatusCode;
}
return 0;
}
Usando il null-conditional operator (?.
) è possibile ottenere il codice di stato HTTP con una sola riga di codice:
HttpStatusCode? status = (ex.Response as HttpWebResponse)?.StatusCode;
La variabile status
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 di accedere in caso di guasto è possibile utilizzare la null-coalescing operator (??
) 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 404 Codice di stato HTTP la stringa conterrà "NotFound". D'altra parte, se il server è offline, la stringa conterrà "ConnectFailure" e così via.
(E per qualcuno che vuole sapere come ottenere il codice di stato secondario HTTP. Questo non è possibile. E 'un concetto di Microsoft IIS che viene registrato solo sul server e mai inviato al client.)
Non sono sicuro se l'operatore '? .' fosse originariamente chiamato operatore di propagazione nullo o operatore condizionale nullo durante la versione di anteprima. Ma il resharper Atlassian fornisce un avvertimento per utilizzare l'operatore di propagazione nullo in tali scenari. È bello sapere che è anche chiamato operatore null-condizionale. – RBT
Un po 'in ritardo per questa parte, ma giusto avviso che l'operatore null-condizionale è una funzionalità C# 6.0, quindi è necessario utilizzare un compilatore che lo supporti. [Stack Overflow answer con ulteriori dettagli] (https://stackoverflow.com/questions/39089426/how-to-install-the-ms-c-sharp-6-0-compiler). VS 2015+ lo ha per impostazione predefinita, ma se si utilizza un tipo di ambiente di compilazione/distribuzione diverso da "la propria macchina", potrebbe essere necessario prendere in considerazione altre cose. – CodeHxr
(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ò essere facilmente esteso ad ulteriori livelli, come in questo caso in cui il WebException
era in realtà l'eccezione interna di un altro (e siamo solo interessati a 404
):
catch (StorageException ex) when (ex.InnerException is WebException wex && wex.Response is HttpWebResponse r && r.StatusCode == HttpStatusCode.NotFound)
Infine: notare come non c'è bisogno di ri-generare l'eccezione nella clausola catch quando non corrisponde ai suoi criteri, dal momento che non entriamo nella clausola in primo luogo con la soluzione di cui sopra.
- 1. 502 codice di stato HTTP
- 2. di analisi codice di stato HTTP
- 3. Codice di stato HTTP per raccolta limitata?
- 4. Codice di stato HTTP per errore generico
- 5. Codice di stato HTTP per database inattivo
- 6. Python urllib2 URLError Codice di stato HTTP.
- 7. Codice di stato HTTP per PUT
- 8. codice di stato HTTP 400 vs 412
- 9. Codice di stato HTTP 411 - lunghezza desiderata
- 10. Codice di stato HTTP per Captcha
- 11. Codice di stato HTTP per dati errati
- 12. codice di stato HTTP HEAD del verbo
- 13. Codice di stato HTTP in corso?
- 14. System.Net.WebException: l'operazione è scaduta
- 15. fa il nome di un codice di stato HTTP importa
- 16. Ottenere un codice di stato http vuoto 500 dall'API Web
- 17. Che cos'è il codice di stato HTTP 000?
- 18. Restituzione del codice di stato http dal controller Web Api
- 19. Qual è l'accordo con il codice di stato HTTP 308?
- 20. Perché display_errors modifica il codice di stato HTTP?
- 21. Python CGI restituisce un codice di stato http, come 403?
- 22. Facebook SDK 3.1 - Errore: codice di stato HTTP: 400
- 23. restituire un codice di stato HTTP specifico con php
- 24. Quale codice di stato HTTP per account non attivato?
- 25. Ottenere codice di stato HTTP da Selenium WebDriver C#
- 26. Impossibile eliminare l'ultimo contatto: quale codice di stato Http?
- 27. Webpy: come impostare il codice di stato http su 300
- 28. Impostazione del codice di stato HTTP in Bottiglia?
- 29. Codice di stato HTTP per il corpo POST non valido
- 30. Web API 2 - ApiController.InternalServerError() restituisce HTTP 400 codice di stato
ma in caso di eccezione "connectfailure" di webexception ottengo la risposta come nulla, in tal caso come posso ottenere il codice httpstatus – Rusty
@rusty: non è possibile. Se si verifica un errore di connessione, non è disponibile alcun codice di stato HTTP. – LukeH
Se l'errore è ProtocolError, non è necessario verificare la risposta per null. Vedere il commento nell'esempio in questa [pagina MSDN] (http://msdn.microsoft.com/en-us/library/es54hw8e%28v=vs.110%29.aspx) –