Pourquoi suis-je recevoir « (304) Non modifié » erreur sur certains liens lors de l'utilisation HttpWebRequest?

StackOverflow https://stackoverflow.com/questions/2603595

Question

Toutes les idées pourquoi certains liens que je tente d'accéder à l'aide HttpWebRequest je reçois « Le serveur distant a renvoyé une erreur: (304) Non modifié. » dans le code?

Le code J'utilise est de poste Jeff (la page semble avoir disparu, voir un copie d'archives à la Wayback machine).

Notez le concept du code est un simple serveur proxy, donc je suis pointant mon navigateur à cette pièce en cours d'exécution locale de code, qui obtient ma demande de navigateurs, puis proxie sur en créant une nouvelle HttpWebRequest, comme vous » ll voir dans le code. Il fonctionne très bien pour la plupart des sites / liens, mais pour une cette erreur arrive. Vous verrez un bit clé dans le code est là où il semble copier les paramètres d'en-tête HTTP de la requête du navigateur à la demande de sortir du site, et il copie dans les attributs d'en-tête. Je ne sais pas si le problème est quelque chose à voir avec la façon dont il imite cet aspect de la demande et ce qui se passe à la suite revient?

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

Je reçois la question par exemple de http://en.wikipedia.org/wiki/Main_Page

PS. ICI UPDATE

ne peut toujours pas travailler cela. Fondamentalement, je peux identifier 1 lien qui a un problème, et il semble fonctionner correctement, 2e temps, il obtient l'erreur, 3ème fois OK, 4ème fois obtient l'erreur, 5ème fois OK, etc. Comme il y a un état ne s'effacé ou quelque chose dans le code. J'ai essayé de nettoyer un peu le code à l'aide « à l'aide des » énoncés de type etc.

Voici le code. Si quelqu'un peut repérer pourquoi chaque 2ème fois que j'accédez à un lien comme http://newsimg.bbc.co.uk/css/screen/1_0_16/nol/v4/story.css (à partir de la 2ème fois, pas le premier) via ce code proxy je reçois l'erreur I adorerais entendre.

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();
        }
    }
}

Et voici un exemple de ce que je vois - premier coup est bon, 2ème erreur a ...

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.
Était-ce utile?

La solution

D'abord, ce n'est pas une erreur. 3xx indique une redirection. Les erreurs réelles sont 4xx (erreur client) et < a href = "http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10.5" rel = "noreferrer"> 5xx (erreur de serveur).

Si un client obtient un 304 Not Modified , puis il est de la responsabilité du client pour afficher la resouce en question de son propre cache. En général, la procuration ne devrait pas inquiéter à ce sujet. Il est juste le messager.

Autres conseils

Ceci est prévu le comportement.

Lorsque vous effectuez une requête HTTP, le serveur renvoie normalement 200 OK de code. Si vous définissez If-Modified-Since, le serveur peut retourner 304 Not modified (et la réponse n'aura pas le contenu). Ceci est censé être votre signal que la page n'a pas été modifiée.

Les de la classe ont bêtement décidé que 304 doit être traité comme une erreur et lancer une exception. Maintenant, vous devez nettoyer après eux en attrapant l'exception chaque fois que vous essayez d'utiliser If-Modified-Since.

en appuyant simplement sur F5 est pas toujours travailler.

pourquoi?

Parce que votre fournisseur d'accès Internet est mise en cache également des données Web pour vous.

Solution:. Force Actualiser

Force rafraîchir votre navigateur en appuyant sur CTRL + F5 dans Firefox ou Chrome trop Effacez le cache fournisseur d'accès Internet, au lieu de simplement appuyer sur F5

Vous pouvez alors voir la réponse 200 au lieu de 304 dans le navigateur F12 onglet Réseau d'outils de développement.

Une autre astuce consiste à ajouter un point d'interrogation ? à la fin de la chaîne URL de la page demandée:

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

La marque question veillera à ce que le navigateur rafraîchir la demande sans mise en cache des requêtes précédentes.

De plus Visual Studio vous pouvez définir le navigateur par défaut Chrome Incognito mode pour éviter les problèmes de cache tout en développant, en ajoutant Chrome le mode incognito comme navigateur par défaut, voir les étapes (auto illustré):

Sélectionnez Parcourir avec ... Cliquez sur Ajouter ... point à la chrome.exe sur votre plate-forme, ajouter argument "Incognito" «

Je pense que vous ne l'avez pas installé ces fonctions. voir ci-dessous dans l'image.

entrer image description ici

Je souffrais aussi de ce problème il y a quelques jours. Après avoir installé cette fonction alors je l'ai résolu. Si vous ne l'avez pas installé cette fonction installée il.

Installer processus:

  1. aller en studio Android
  2. Outils
  3. Android
  4. SDK directeur
  5. Apparence et comportement
  6. SDK Android
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top