Cuando un servidor web responde a HttpWebRequest.GetResponse()
con HTTP 304 (No modificado), GetResponse()
arroja un WebException
, lo cual es muy extraño para mí. ¿Es esto por diseño o me falta algo obvio aquí?HttpWebRequest.GetResponse lanza WebException en HTTP 304
Respuesta
Ok, esto parece ser un comportamiento por diseño y un ejemplo perfecto de vexing exception. Esto se puede solucionar con esto:
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;
}
}
Esto es realmente un problema frustrante, y puede ser, alternativamente, trabajó en torno utilizando la siguiente clase de método de extensión y llamando 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;
}
}
}
}
Lees más sobre esto en mi blog sobre este tema en http://fearthecowboy.com/2011/09/02/fixing-webrequests-desire-to-throw-exceptions-instead-of-returning-status/
La manera de evitar esto es configurar System.WebException
AllowAutoRedirect propiedad a false
. Esto desactiva la lógica de redirección automática del WebRequest
. Parece estar roto para 304 solicitudes de redireccionamiento, ya que no es una redirección real en el sentido más estricto. Por supuesto, eso significa que las otras solicitudes de redirección 3xx
deben manejarse manualmente.
Absolutamente brillante. ¿Por qué debería pagar la maquinaria excepcional de mano dura si no la necesito? – jsuddsjr
también me encontré con este problema con código:
try
{
...
var webResponse = req.GetResponse();
...
}
catch (WebException ex)
{
Log.Error("Unknown error occured", ex);
//throw;
}
y parece que si el servidor remoto devuelve 304 el estado que se debe pasar a Navegador lanzando este error o devolver a medida 304 para que el navegador podría volver respuesta en caché De lo contrario, probablemente recibirá respuesta vacía del servidor remoto.
Así que en mi caso de un comportamiento normal con el manejo de caché correcta Debe ser como:
try
{
...
var webResponse = req.GetResponse();
...
}
catch (WebException ex)
{
if (((HttpWebResponse)ex.Response).StatusCode == HttpStatusCode.NotModified)
throw;
Log.Error("Unknown error occured", ex);
}
Así como un FYI, esto es una actualización de Anton Gogolev's answer que utiliza el C# 6 (VS2015) when
cláusula. Es un poco menos molesto cuando se utiliza un depurador, ya que elimina un punto de captura:
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. GetResponse lanza WebException y ex.Response es nulo
- 2. Cómo procesar WebResponse cuando .NET lanza WebException ((400) Bad Request)?
- 3. Encabezado futuro lejano y HTTP 304
- 4. WebException al leer la corriente de respuesta de WebException
- 5. Cómo prevenir HTTP 304 en el servidor de prueba Django
- 6. HttpWebRequest.GetResponse(): ¿qué códigos de estado específicos causan una excepción?
- 7. C# HttpWebRequest.GetResponse: ¿cómo se maneja el uso de StatusCode para una respuesta de no excepción vs webexception?
- 8. Manejando dos WebException correctamente
- 9. Manejo de errores de HttpWebRequest.GetResponse
- 10. Captura de una WebException específica (550)
- 11. System.Net.HttpWebResponse.GetResponseStream() devuelve el cuerpo truncado en WebException
- 12. HTTP if-none-match y if-modified-since y aclaración 304 en PHP
- 13. ¿Se requiere HttpWebRequest.GetResponse para completar un POST?
- 14. ¿Cómo puedo integrar un 304 en Django?
- 15. Cómo prevenir "304 no modificado" en nginx?
- 16. Problemas para minimizar 304 solicitudes
- 17. 304: La condición especificada utilizando encabezados condicional HTTP no se cumple
- 18. createEntityManager lanza java.lang.NullPointerException en org.hibernate.engine.transaction.internal.jta.JtaStatusHelper.getStatus
- 19. IE9 falsificaciones 304 después de recibir ETag
- 20. SoapClient lanza versión incorrecto
- 21. Obtener el número de error en WebException Error
- 22. No se puede encontrar HttpWebRequest.GetResponse() en el proyecto WP7
- 23. 304: Caché no modificado y front-end
- 24. Max-edad y 304 Not Modified Procesamiento
- 25. HttpWebRequest.GetResponse() se cuelga la segunda vez que se llama
- 26. 304 de estado con FileResult en ASP.NET MVC RC1
- 27. WebException cómo obtener una respuesta completa con un cuerpo?
- 28. asíncrono NSURLConnection Lanza EXC_BAD_ACCESS
- 29. ¿Por qué XmlDocument.LoadXml lanza System.Net.WebException?
- 30. Cómo detener .Net HttpWebRequest.GetResponse() al generar una excepción
Esto funciona en la mayoría de los casos, pero algunos servidores web pueden devolver un cuerpo de respuesta al devolver un error 404. ¡En ese caso, el código anterior trataría a un 404 como trata a un 304! – comshak
@comshak eso es "bueno saberlo". El código de llamada deberá conocer cuáles son los códigos de respuesta aceptables. – roufamatic
También agregué '|| ((HttpWebResponse) ex.Response) .StatusCode! = HttpStatusCode.NotModified' –