httpwebrequestを使用するときに、いくつかのリンクで「(304)変更されていない」エラーを取得するのはなぜですか?

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

質問

HTTPWEBREQUESTを使用してアクセスしようとするリンクでは、「リモートサーバーがエラーを返した:(304)変更されていない」というアイデアがあります。コードで?

私が使用しているコードはからです ここにジェフの投稿 (ページは消えたようです、 Waybackマシンのアーカイブコピー).

コードの概念はシンプルなプロキシサーバーであるため、このローカルに実行されているコードをブラウザに向けて、ブラウザのリクエストを取得し、新しいhttpwebRequestを作成してプロキシを作成します。コード。ほとんどのサイト/リンクに最適ですが、一部の場合、このエラーが発生します。コードに1つの重要なビットが表示されます。ここでは、ブラウザリクエストからサイトへのリクエストへのHTTPヘッダー設定をコピーしているように見える場合、ヘッダー属性にコピーします。この問題がリクエストのこの側面をどのように模倣するか、そして結果が戻ってきたときに何が起こるかと関係があるかどうかはわかりません。

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

たとえば、問題が発生します http://en.wikipedia.org/wiki/main_page

詩こちらを更新してください

それでもこれを解決することはできません。基本的に、問題がある1つのリンクを識別できます。正常に動作するようです。2回目はエラーを取得し、3回目はOK、4回目はエラーが発生し、5回目がOKなどがあります。コード内の何か。 「タイプステートメントなど」を使用してコードを少しクリーンアップしようとしました。

これがコードです。誰かが2回ごとになぜ私がリンクを閲覧するのかを見つけることができるなら http://newsimg.bbc.co.uk/css/screen/1_0_16/nol/v4/story.css (2回目ではなく、2回目ではなく)このプロキシコードを介して、聞きたいエラーが得られます。

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

そして、ここに私が見たものの例があります - 最初のヒットは良い、2番目はエラーを持っています...

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.
役に立ちましたか?

解決

まず、これはエラーではありません。 3xx リダイレクトを示します。実際のエラーはそうです 4xx (クライアントエラー)および 5xx (サーバーエラー)。

クライアントが取得した場合 304 Not Modified, 、次に、問題のゾーンを独自のキャッシュから表示することはクライアントの責任です。一般に、プロキシはこれについて心配する必要はありません。それはただのメッセンジャーです。

他のヒント

これは意図された動作です。

HTTP要求を行うと、サーバーは通常コードを返します 200 OK. 。設定した場合 If-Modified-Since, 、サーバーが返される場合があります 304 Not modified (そして、応答にはコンテンツがありません)。これは、ページが変更されていないというあなたの手がかりになるはずです。

クラスの著者は愚かに決定しました それ 304 エラーとして扱われ、例外をスローする必要があります。今、あなたはあなたが使用しようとするたびに例外をキャッチすることによって彼らの後にクリーンアップする必要があります If-Modified-Since.

押しているだけです F5 常に機能しているわけではありません。

なぜ?

ISPはWebデータもキャッシュしているためです。

解決: 強制リフレッシュ。

押してブラウザを強制します Ctrl + F5 FirefoxまたはChromeでISPキャッシュをクリアするだけでなく、ただ押すだけではありません F5

その後、ブラウザでは304ではなく200の応答が表示されます F12 開発者ツールネットワークタブ。

別のトリックは、疑問符を追加することです ? 要求されたページのURL文字列の最後に:

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

疑問符は、以前のリクエストをキャッシュせずにブラウザがリクエストを更新することを保証します。

さらに ビジュアルスタジオ デフォルトのブラウザをに設定できます クロムシークレット デフォルトのブラウザとしてChrome in Incognitoモードを追加することにより、開発中のキャッシュの問題を回避するモード(Self Illustrated)を参照してください。

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

これらの機能をインストールしていないと思います。写真をご覧ください。

enter image description here

また、数日前にこの問題に苦しんでいました。この機能をインストールした後、私はそれを解決しました。この機能をインストールしていない場合は、インストールしてください。

プロセスをインストールする:

  1. Android Studioにアクセスしてください
  2. ツール
  3. アンドロイド
  4. SDKマネージャー
  5. 外観と行動
  6. Android SDK
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top