Quando un server Web risponde a HttpWebRequest.GetResponse()
con HTTP 304 (non modificato), GetResponse()
restituisce uno WebException
, il che è molto strano per me. È questo di progettazione o mi manca qualcosa di ovvio qui?HttpWebRequest.GetResponse lancia WebException su HTTP 304
risposta
Ok, questo sembra essere un comportamento di progettazione e un perfetto esempio di vexing exception. Questo può essere risolto con questo:
public static HttpWebResponse GetHttpResponse(this HttpWebRequest request)
{
try
{
return (HttpWebResponse) request.GetResponse();
}
catch (WebException ex)
{
if(ex.Response == null || ex.Status != WebExceptionStatus.ProtocolError)
throw;
return (HttpWebResponse)ex.Response;
}
}
Questo è veramente un problema frustrante, e può essere alternativamente lavorato intorno utilizzando la seguente classe metodo di estensione e la chiamata request.BetterGetResponse()
//-----------------------------------------------------------------------
//
// Copyright (c) 2011 Garrett Serack. All rights reserved.
//
//
// The software is licensed under the Apache 2.0 License (the "License")
// You may not use the software except in compliance with the License.
//
//-----------------------------------------------------------------------
namespace CoApp.Toolkit.Extensions {
using System;
using System.Net;
public static class WebRequestExtensions {
public static WebResponse BetterEndGetResponse(this WebRequest request, IAsyncResult asyncResult) {
try {
return request.EndGetResponse(asyncResult);
}
catch (WebException wex) {
if(wex.Response != null) {
return wex.Response;
}
throw;
}
}
public static WebResponse BetterGetResponse(this WebRequest request) {
try {
return request.GetResponse();
}
catch (WebException wex) {
if(wex.Response != null) {
return wex.Response;
}
throw;
}
}
}
}
Hai letto più su di esso nel mio post su questo argomento presso http://fearthecowboy.com/2011/09/02/fixing-webrequests-desire-to-throw-exceptions-instead-of-returning-status/
Il modo per evitare questo System.WebException
è quello di impostare AllowAutoRedirect proprietà false
. Disabilita la logica di reindirizzamento automatico di WebRequest
. Sembra essere rotto per 304 richieste di reindirizzamento, in quanto non è un vero reindirizzamento nel senso più stretto. Ovviamente ciò significa che le altre richieste di reindirizzamento 3xx
devono essere gestite manualmente.
Assolutamente geniale. Perché dovrei pagare per il macchinario eccezionalmente pesante se non ne ho bisogno? – jsuddsjr
anche io sono imbattuto a questo problema con il codice:
try
{
...
var webResponse = req.GetResponse();
...
}
catch (WebException ex)
{
Log.Error("Unknown error occured", ex);
//throw;
}
e sembra che se server remoto restituisce 304 di stato che deve essere passato al browser Di gettando questo errore o di ritorno personalizzato 304 in modo che il browser potrebbe tornare risposta memorizzata nella cache. Altrimenti probabilmente riceverai una risposta vuota dal server remoto.
Quindi, nel mio caso, per un comportamento normale con la corretta gestione della cache dovrebbe essere come:
try
{
...
var webResponse = req.GetResponse();
...
}
catch (WebException ex)
{
if (((HttpWebResponse)ex.Response).StatusCode == HttpStatusCode.NotModified)
throw;
Log.Error("Unknown error occured", ex);
}
Proprio come un FYI, si tratta di un aggiornamento per Anton Gogolev's answer che utilizza la (VS2015) when
clausola C# 6. È un po 'meno fastidioso quando si usa un debugger quando si rimuove uno slogan:
public static HttpWebResponse GetHttpResponse(this HttpWebRequest request)
{
try
{
return (HttpWebResponse) request.GetResponse();
}
catch (WebException ex)
when (ex.Status == WebExceptionStatus.ProtocolError && ex.Response != null)
{
return (HttpWebResponse) ex.Response;
}
}
- 1. WebException su richiesta HTTP durante il debug
- 2. Estremo futuro scadrà intestazione e HTTP 304
- 3. HttpWebRequest.GetResponse() continua a scaduta
- 4. comportamento Timeout in HttpWebRequest.GetResponse() vs GetResponseAsync()
- 5. Come elaborare WebResponse quando .NET lancia WebException ((400) Richiesta non valida)?
- 6. Gestione degli errori da HttpWebRequest.GetResponse
- 7. Gestione corretta di due WebException
- 8. HttpWebRequest lancia un'eccezione per 404
- 9. akka http lancia EntityStreamException: troncamento del flusso di entità
- 10. Jmeter 2.10 Il registratore HTTP lancia l'eccezione keytool
- 11. Fare una richiesta HTTP usando node.js lancia EAFNOSUPPORT
- 12. Problemi minimizzando 304 richieste
- 13. GetResponse genera WebException ed ex.Response è nullo
- 14. HttpWebRequest.GetResponse è necessario per completare un POST?
- 15. WebException durante la lettura di un flusso di risposta di WebException
- 16. Lancia l'immagine visualizzata capovolta su iPad.
- 17. System.Net.HttpWebResponse.GetResponseStream() restituisce il corpo troncato in WebException
- 18. Come ridurre apache dimensione intestazione di risposta HTTP, mentre 304 Non modificato
- 19. HttpURLConnection lancia l'eccezione
- 20. intestazioni risposta HTTP corrette per 304 secondi dopo la scadenza del contenuto
- 21. Quali eccezioni lancia Newtonsoft.Json.DeserializeObject?
- 22. Se le risposte HTTP 304 non modificate contengono intestazioni di controllo della cache?
- 23. jekyll serve e lancia
- 24. Come evitare totalmente le risposte HTTP 304 nel middleware statico Connect/Express?
- 25. Perché il server Web ha inviato il file anziché un http 304: non modificato?
- 26. IE9 fake 304 dopo aver ricevuto ETag
- 27. Max-age e 304 Not Modified lavorazione
- 28. Perché ottengo l'errore "(304) Non modificato" su alcuni collegamenti quando si utilizza HttpWebRequest?
- 29. HttpWebRequest.GetResponse() si blocca la seconda volta che viene chiamato
- 30. HTTPWebRequest.GetResponse() fallito con richieste autenticate attraverso un proxy trasparente
Questo funziona la maggior parte dei casi, ma alcuni server Web potrebbero restituire un corpo di risposta quando si restituisce un errore 404. In tal caso, il codice precedente tratterà un 404 poiché tratta un 304! – comshak
@comshak è un "utile da sapere". Il codice chiamante dovrà essere consapevole di quali sono i codici di risposta accettabili. – roufamatic
Ho anche aggiunto '|| ((HttpWebResponse) ex.Response) .StatusCode! = HttpStatusCode.NotModified' –