Frage

Alle Ideen, warum ich auf einigen Links, auf die ich versuche, mit httpwebRequest zugreifen zu können, "Der Remote -Server hat einen Fehler zurückgegeben: (304) Nicht geändert." im Code?

Der Code, den ich verwende, stammt aus Jeffs Beitrag hier (Die Seite scheint verschwunden zu sein, siehe eine Archivkopie am Wayback -Computer).

Beachten Sie, dass das Konzept des Codes ein einfacher Proxy -Server ist. Ich zeige also meinen Browser auf diesen lokal ausgeführten Code, der meine Browseranfrage erhält, und stellt ihn anschließend an, indem Sie ein neues HTTPWebRequest erstellen, wie Sie sehen werden, wie Sie sehen werden der Code. Für die meisten Websites/Links funktioniert es hervorragend, aber für einige erscheint dieser Fehler. In dem Code wird ein Schlüsselbit angezeigt, an dem die HTTP -Header -Einstellungen aus der Browseranforderung auf die Anforderung an die Site kopiert werden, und es kopiert in den Header -Attributen. Ich bin mir nicht sicher, ob das Problem etwas damit zu tun hat, wie es diesen Aspekt der Anfrage nachahmt, und was passiert dann, wie das Ergebnis zurückkommt?

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

Ich bekomme das Problem zum Beispiel von http://en.wikipedia.org/wiki/main_page

Ps. Aktualisieren Sie hier

Ich kann das immer noch nicht ausarbeiten. Grundsätzlich kann ich 1 Link identifizieren, das ein Problem hat, und es scheint einwandfrei zu funktionieren, 2. Mal wird der Fehler, 3. Mal OK, 4. Mal den Fehler, das 5. Mal OK usw., als ob ein Zustand nicht gelöscht oder nicht gelöscht oder etwas im Code. Ich habe versucht, den Code mit "Typ" -Typanweisungen usw. ein bisschen zu bereinigen.

Hier ist der Code. Wenn jemand erkennen kann, warum ich jedes zweite Mal zu einem Link stöbere wie wie http://newsimg.bbc.co.uk/css/screen/1_0_16/nol/v4/story.css (Ab dem zweiten Mal, nicht die erste) über diesen Proxy -Code erhalte ich den Fehler, den ich gerne hören würde.

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

Und hier ist ein Beispiel für das, was ich sehe - der erste Hit ist gut, 2. hat Fehler ...

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.
War es hilfreich?

Lösung

Erstens ist dies kein Fehler. Das 3xx bezeichnet eine Umleitung. Die wirklichen Fehler sind 4xx (Client -Fehler) und 5xx (Serverfehler).

Wenn ein Kunde einen bekommt 304 Not Modified, Dann liegt es in der Verantwortung des Kunden, die betreffende Resouce aus seinem eigenen Cache anzuzeigen. Im Allgemeinen sollte sich der Stellvertreter darüber keine Sorgen machen. Es ist nur der Bote.

Andere Tipps

Dies ist das beabsichtigte Verhalten.

Wenn Sie eine HTTP -Anforderung stellen, gibt der Server normalerweise Code zurück 200 OK. Wenn Sie einstellen If-Modified-Since, Der Server kann zurückkehren 304 Not modified (Und die Antwort wird nicht den Inhalt haben). Dies soll Ihr Hinweis sein, dass die Seite nicht geändert wurde.

Das Autoren der Klasse haben dumm entschieden das 304 sollte als Fehler behandelt werden und eine Ausnahme auswerfen. Jetzt müssen Sie nach ihnen aufräumen, indem Sie jedes Mal, wenn Sie versuchen zu verwenden If-Modified-Since.

Nur drücken F5 funktioniert nicht immer.

warum?

Weil Ihr ISP auch Webdaten für Sie zwischengespeichert.

Lösung: Erfrischung erzwingen.

Erzwingen Sie, Ihren Browser durch Drücken zu aktualisieren Strg + F5 in Firefox oder Chrom, um den ISP -Cache auch zu löschen, anstatt nur zu drücken F5

Sie können dann 200 Antwort anstelle von 304 im Browser sehen F12 Entwickler -Tools -Netzwerk -Registerkarte.

Ein weiterer Trick ist das Hinzufügen von Fragezeichen ? Am Ende der URL -Zeichenfolge der angeforderten Seite:

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

Das Fragezeichen stellt sicher, dass der Browser die Anfrage aktualisiert, ohne vorherige Anforderungen zu zwischenstrahlen.

Zusätzlich in Visual Studio Sie können den Standardbrowser auf festlegen Chrom in Inkognito Modus, um Cache -Probleme während der Entwicklung zu vermeiden, indem Chrome im Inkognito -Modus als Standardbrowser hinzugefügt wird, siehe die Schritte (selbst illustriert):

Go to browsers list Select browse with... Click Add... Point to the chrome.exe on your platform, add argument "Incognito" Choose the browser you just added and set as default, then click browse

Ich denke, Sie haben diese Funktionen nicht installiert. Siehe unten im Bild.

enter image description here

Ich habe vor einigen Tagen auch unter diesem Problem gelitten. Nach der Installation dieser Funktion habe ich sie gelöst. Wenn Sie diese Funktion nicht installiert haben, installiert sie.

Prozess installieren:

  1. Gehen Sie zum Android Studio
  2. Werkzeug
  3. Android
  4. SDK -Manager
  5. Aussehen und Verhalten
  6. Android SDK
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top