success not modified error code http httpwebrequest http-status-code-304 if-modified-since

not - ¿Por qué recibo el error "(304) No modificado" en algunos enlaces cuando uso HttpWebRequest?



http status code success (4)

Creo que no has instalado estas funciones. ver abajo en la imagen.

También sufrí este problema hace algunos días. Después de instalar esta característica, lo resolví. Si no ha instalado esta característica, entonces la instaló.

Proceso de instalación:

  1. ir a Android Studio
  2. Herramientas
  3. Androide
  4. SDK Manager
  5. Apariencia y Comportamiento
  6. SDK de Android

Alguna idea de por qué en algunos enlaces a los que intento acceder usando HttpWebRequest me aparece "El servidor remoto devolvió un error: (304) No se modificó". en el código?

El código que estoy usando proviene de la publicación de Jeff aquí (la página parece haber desaparecido, vea una copia de archivo en Wayback Machine ).

Tenga en cuenta que el concepto del código es un servidor proxy simple, por lo que apuntaré a mi navegador en este fragmento de código que se ejecuta localmente, que recibe la solicitud de mi navegador, y luego lo encende creando una nueva HttpWebRequest, como verá en el código. Funciona muy bien para la mayoría de los sitios / enlaces, pero para algunos este error aparece. Verá que un bit clave en el código es donde parece copiar la configuración del encabezado http desde la solicitud del navegador hasta su solicitud al sitio y copia los atributos del encabezado. No estoy seguro de si el problema tiene que ver con la forma en que imita este aspecto de la solicitud y, luego, ¿qué sucede cuando vuelve el resultado?

case "If-Modified-Since": request.IfModifiedSince = DateTime.Parse(listenerContext.Request.Headers[key]); break;

Obtengo el problema, por ejemplo, de http://en.wikipedia.org/wiki/Main_Page

PD. ACTUALIZAR AQUÍ

Aún no puede resolver esto. Básicamente puedo identificar 1 enlace que tiene un problema, y ​​parece funcionar bien, la segunda vez que recibe el error, la 3ª vez OK, la 4ª vez recibe el error, la 5ª vez OK, etc. Como si hubiera algún estado que no haya sido aprobado o algo en el código. Intenté limpiar un poco el código usando declaraciones de tipo "usar", etc.

Aquí está el código. Si alguien puede ver por qué cada 2 veces, busco un enlace como http://newsimg.bbc.co.uk/css/screen/1_0_16/nol/v4/story.css (comenzando en la 2da vez, no en la primera) a través de este código de proxy me sale el error que me encantaría escuchar.

class Program { static void Main(string[] args) { Proxy p = new Proxy(8080); Thread proxythread = new Thread(new ThreadStart(p.Start)); proxythread.Start(); Console.WriteLine("Proxy Started. Press Any Key To Stop..."); Console.ReadKey(); p.Stop(); } } public class Proxy { private HttpListener _listener; private int _port; public Proxy(int port) { int defaultport = 8080; // Setup Thread Pool System.Threading.ThreadPool.SetMaxThreads(50, 1000); System.Threading.ThreadPool.SetMinThreads(50, 50); // Sanitize Port Number if (port < 1024 || port > 65535) port = defaultport; // Create HttpListener Prefix string prefix = string.Format("http://*:{0}/", port); _port = port; // Create HttpListener _listener = new HttpListener(); _listener.Prefixes.Add(prefix); } public void Start() { _listener.Start(); while (true) { HttpListenerContext request = null; try { request = _listener.GetContext(); // Statistics (by Greg) int availThreads = -1; int compPortThreads = -1; ThreadPool.GetAvailableThreads(out availThreads, out compPortThreads); log("INFO", request.Request.Url.ToString(), "START - [" + availThreads + "]"); ThreadPool.QueueUserWorkItem(ProcessRequest, request); } catch (HttpListenerException ex) { log("ERROR", "NA", "INFO: HttpListenerException - " + ex.Message); break; } catch (InvalidOperationException ex) { log("ERROR", "NA", "INFO: InvalidOperationException - " + ex.Message); break; } } } public void Stop() { _listener.Stop(); } private void log(string sev, string uri, string message) { Console.Out.WriteLine(Process.GetCurrentProcess().Id + " - " + sev + " (" + uri + "): " + message); } private void ProcessRequest(object _listenerContext) { #region local variables HttpWebRequest psRequest; // Request to send to remote web server HttpWebResponse psResponse; // Response from remote web server List<byte> requestBody = new List<byte>(); // Byte array to hold the request''s body List<byte> responseBody = new List<byte>(); // Byte array to hold the response''s body byte[] buffer; string uri = ""; #endregion var listenerContext = (HttpListenerContext)_listenerContext; uri = listenerContext.Request.Url.ToString().Replace(string.Format(":{0}", _port), ""); // Create Interent Request HttpWebRequest internetRequest = (HttpWebRequest)WebRequest.Create(uri); #region Build Request Up internetRequest.Method = listenerContext.Request.HttpMethod; internetRequest.ProtocolVersion = listenerContext.Request.ProtocolVersion; internetRequest.UserAgent = listenerContext.Request.UserAgent; foreach (string key in listenerContext.Request.Headers.AllKeys) { try { switch (key) { case "Proxy-Connection": case "Connection": internetRequest.KeepAlive = (listenerContext.Request.Headers[key].ToLower() == "keep-alive") ? true : false; break; case "Content-Length": internetRequest.ContentLength = listenerContext.Request.ContentLength64; break; case "Content-Type": internetRequest.ContentType = listenerContext.Request.ContentType; break; case "Accept": internetRequest.Accept = listenerContext.Request.Headers[key]; break; case "Host": break; case "Referer": internetRequest.Referer = listenerContext.Request.Headers[key]; break; case "If-Modified-Since": internetRequest.IfModifiedSince = DateTime.Parse(listenerContext.Request.Headers[key]); break; default: internetRequest.Headers.Add(key, listenerContext.Request.Headers[key]); break; } } catch (Exception ex) { Console.WriteLine("Error settup up psRequest object. Error = " + ex.Message + "/n" + ex.StackTrace); } } #endregion #region Copy content into request buffer = new byte[1024]; using (Stream instream = listenerContext.Request.InputStream) { int incount = instream.Read(buffer, 0, buffer.Length); while (incount > 0) { internetRequest.GetRequestStream().Write(buffer, 0, incount); incount = instream.Read(buffer, 0, buffer.Length); } } #endregion // Get Internet Response HttpWebResponse internetResponse = null; try { using (internetResponse = (HttpWebResponse)internetRequest.GetResponse()) { #region Configure Local Response Header Keys foreach (string key in internetResponse.Headers.Keys) { try { switch (key) { case "Transfer-Encoding": listenerContext.Response.SendChunked = (internetResponse.Headers[key].ToLower() == "chunked") ? true : false; break; case "Content-Length": listenerContext.Response.ContentLength64 = internetResponse.ContentLength; break; case "Content-Type": listenerContext.Response.ContentType = internetResponse.Headers[key]; break; case "Keep-Alive": listenerContext.Response.KeepAlive = true; break; default: listenerContext.Response.Headers.Add(key, internetResponse.Headers[key]); break; } } catch (Exception ex) { log("ERROR", uri, "Error settup up listenerContext.Response objects. Error = " + ex.Message + "/n" + ex.StackTrace); } } #endregion try { // Transfer the body data from Internet Response to Internal Response buffer = new byte[1024]; using (Stream inputStream = internetResponse.GetResponseStream()) { int outcount = inputStream.Read(buffer, 0, buffer.Length); while (outcount > 0) { listenerContext.Response.OutputStream.Write(buffer, 0, outcount); outcount = inputStream.Read(buffer, 0, buffer.Length); } } } catch (Exception ex) { log("ERROR", uri, "Could not obtain response from URI: " + ex.Message); } finally { listenerContext.Response.OutputStream.Close(); } } } catch (Exception ex) { //if (ex is InvalidOperationException || // ex is ProtocolViolationException || // ex is WebException) //{ // log(uri, "Could not successfully get response: " + ex.GetType() + " - " + ex.Message); // listenerContext.Response.Close(); // return; //} //else { throw; } log("ERROR", uri, "Could not successfully get response: " + ex.GetType() + " - " + ex.Message); listenerContext.Response.Close(); } } }

Y aquí hay un ejemplo de lo que veo: el primer golpe es bueno, el segundo tiene un error ...

Proxy Started. Press Any Key To Stop... 2080 - INFO (http://newsimg.bbc.co.uk:8080/css/screen/1_0_16/nol/v4/story.css): START - [50] 2080 - INFO (http://newsimg.bbc.co.uk:8080/css/screen/1_0_16/nol/v4/story.css): START - [50] 2080 - ERROR (http://newsimg.bbc.co.uk/css/screen/1_0_16/nol/v4/story.css): Could not successfully get response: System.Net.WebException - The remote server returned an error: (304) Not Modified.


Este es el comportamiento previsto.

Cuando realiza una solicitud HTTP, el servidor normalmente devuelve el código 200 OK . Si configura If-Modified-Since , el servidor puede devolver 304 Not modified (y la respuesta no tendrá el contenido). Se supone que esto es su señal de que la página no ha sido modificada.

Los autores de la clase tontamente han decidido que 304 debe tratarse como un error y lanzar una excepción. Ahora tiene que limpiar después de ellos capturando la excepción cada vez que intente usar If-Modified-Since .


Primero, esto no es un error. El 3xx denota una redirección. Los errores reales son 4xx (error del cliente) y 5xx (error del servidor).

Si un cliente obtiene un 304 Not Modified , entonces es responsabilidad del cliente mostrar el recurso en cuestión desde su propio caché. En general, el proxy no debe preocuparse por esto. Es solo el mensajero.


Solo presionando F5 no siempre funciona.

¿por qué?

Debido a que su ISP también está almacenando datos web en caché para usted.

Solución: Refrescar Fuerza.

Force actualice su navegador presionando CTRL + F5 en Firefox o Chrome para borrar la caché de ISP, en lugar de simplemente presionar F5

A continuación, puede ver 200 respuestas en lugar de 304 en la pestaña de la red de herramientas del desarrollador F12 del navegador.

Otro truco es agregar un signo de interrogación ? al final de la cadena de URL de la página solicitada:

http://localhost:52199/Customers/Create?

El signo de interrogación garantizará que el navegador actualice la solicitud sin almacenar en caché ninguna solicitud anterior.