मुझे HttpWebRequest का उपयोग करते समय कुछ लिंक पर त्रुटि "(304) संशोधित क्यों नहीं हो रही है?




http-status-code-304 if-modified-since (4)

सबसे पहले, यह कोई त्रुटि नहीं है। 3xx एक पुनर्निर्देशन दर्शाता है। असली त्रुटियां 4xx (क्लाइंट त्रुटि) और 5xx (सर्वर त्रुटि) हैं।

यदि किसी ग्राहक को 304 Not Modified जाता है, तो ग्राहक के अपने कैश से प्रश्न में रेजोस प्रदर्शित करने की ग्राहक की ज़िम्मेदारी है। सामान्य रूप से, प्रॉक्सी को इसके बारे में चिंता नहीं करना चाहिए। यह सिर्फ दूत है।

कोई भी विचार क्यों कुछ लिंक पर जिन्हें मैं HttpWebRequest का उपयोग करके एक्सेस करने का प्रयास करता हूं, मुझे मिल रहा है "रिमोट सर्वर ने एक त्रुटि लौटा दी: (304) संशोधित नहीं।" कोड में?

मैं जिस कोड का उपयोग कर रहा हूं वह जेफ की पोस्ट से है (पृष्ठ गायब हो गया है, वेबैक मशीन पर एक संग्रह प्रतिलिपि देखें)।

नोट करें कि कोड की अवधारणा एक साधारण प्रॉक्सी सर्वर है, इसलिए मैं अपने ब्राउज़र को इस स्थानीय रूप से चलने वाले कोड पर इंगित कर रहा हूं, जो मेरे ब्राउज़र अनुरोध करता है, और उसके बाद एक नया HttpWebRequest बनाकर इसे प्रॉक्सी करता है, जैसा कि आप देखेंगे कोड। यह अधिकांश साइटों / लिंक के लिए बहुत अच्छा काम करता है, लेकिन कुछ के लिए यह त्रुटि आती है। आपको कोड में एक महत्वपूर्ण बिट दिखाई देगा, जहां यह ब्राउज़र अनुरोध से http हेडर सेटिंग्स को साइट पर अनुरोध करने के लिए कॉपी करता है, और यह हेडर विशेषताओं में प्रतिलिपि बनाता है। निश्चित नहीं है कि समस्या यह है कि यह अनुरोध के इस पहलू की नकल कैसे करता है और फिर परिणाम क्या होता है, तो क्या होता है?

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

मुझे उदाहरण के लिए http://en.wikipedia.org/wiki/Main_Page से समस्या मिलती है

पुनश्च। यहां अपडेट करें

अभी भी यह काम नहीं कर सकता। असल में मैं 1 लिंक की पहचान कर सकता हूं जिसमें कोई समस्या है, और ऐसा लगता है कि यह ठीक काम करता है, दूसरी बार यह त्रुटि हो जाती है, तीसरी बार ठीक है, 4 वें समय त्रुटि हो जाती है, 5 वें समय ठीक है जैसे कि कुछ राज्य साफ़ नहीं हो रहा है या कोड में कुछ मैंने "उपयोग" प्रकार कथन आदि का उपयोग करके कोड को थोड़ा साफ करने की कोशिश की है।

कोड यहाँ है। यदि कोई भी स्पॉट कर सकता है कि हर बार जब मैं http://newsimg.bbc.co.uk/css/screen/1_0_16/nol/v4/story.css (दूसरी बार शुरू होता हूं, पहले नहीं) लिंक पर ब्राउज़ करता हूं इस प्रॉक्सी कोड के माध्यम से मुझे वह त्रुटि मिलती है जिसे मैं सुनना पसंद करूंगा।

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.

बस F5 दबाकर हमेशा काम नहीं कर रहा है।

क्यूं कर?

क्योंकि आपका आईएसपी भी आपके लिए वेब डेटा कैशिंग कर रहा है।

समाधान: बल ताज़ा करें।

फ़ायरफ़ॉक्स या क्रोम में CTRL + F5 दबाकर अपने ब्राउज़र को रीफ्रेश करें, केवल F5 दबाए जाने के बजाय, आईएसपी कैश को साफ़ करने के लिए

फिर आप ब्राउज़र F12 डेवलपर टूल नेटवर्क टैब में 304 के बजाय 200 प्रतिक्रिया देख सकते हैं।

प्रश्न चिह्न जोड़ने के लिए एक और चाल है ? अनुरोधित पृष्ठ की यूआरएल स्ट्रिंग के अंत में:

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

प्रश्न चिह्न यह सुनिश्चित करेगा कि ब्राउजर किसी भी पिछले अनुरोध को कैश किए बिना अनुरोध को रीफ्रेश करेगा।


मुझे लगता है कि आपने इन सुविधाओं को स्थापित नहीं किया है। तस्वीर में नीचे देखें।

मुझे कुछ दिन पहले इस समस्या से भी पीड़ित था। इस सुविधा को स्थापित करने के बाद मैंने इसे हल किया। यदि आपने इस सुविधा को इंस्टॉल नहीं किया है तो इसे इंस्टॉल करें।

प्रक्रिया स्थापित करें:

  1. एंड्रॉइड स्टूडियो पर जाएं
  2. उपकरण
  3. एंड्रॉयड
  4. एसडीके प्रबंधक
  5. उपस्थिति और व्यवहार
  6. एंड्रॉइड एसडीके

यह इरादा व्यवहार है।

जब आप HTTP अनुरोध करते हैं, तो सर्वर सामान्य रूप से कोड 200 OK । यदि आप If-Modified-Since सेट करते हैं, तो सर्वर 304 Not modified कर सकता 304 Not modified (और प्रतिक्रिया में सामग्री नहीं होगी)। यह आपका क्यू माना जाता है कि पृष्ठ को संशोधित नहीं किया गया है।

कक्षा के लेखकों ने मूर्खता से फैसला किया है कि 304 को एक त्रुटि के रूप में माना जाना चाहिए और अपवाद फेंकना चाहिए। अब जब भी आप If-Modified-Since का उपयोग करने का प्रयास करते हैं If-Modified-Since अपवाद को पकड़कर उन्हें साफ करना If-Modified-Since





if-modified-since