2010-06-16 14 views
6

मैं किसी भी सर्वर पर यूआरएल कॉल को विंडोज मशीन पर किसी एप्लिकेशन के भीतर चलने वाले वीबीस्क्रिप्ट से बनाया गया कैश बंद करना चाहता हूं। ऐसा करने के लिए मैं किस कार्य/विधि/वस्तु का उपयोग करता हूं?वीबीस्क्रिप्ट: सर्वर से HTTP प्राप्त करने के लिए HTTP की प्रतिक्रिया प्राप्त करने के लिए अक्षम करें

जब कॉल पहली बार किया जाता है, तो मेरा लिनक्स आधारित अपाचे सर्वर सीजीआई पर्ल स्क्रिप्ट से प्रतिक्रिया वापस लौटाता है कि यह चल रहा है। हालांकि, स्क्रिप्ट के बाद के रन पहली बार एक ही प्रतिक्रिया का उपयोग कर रहे हैं, इसलिए डेटा कहीं भी कैश किया जा रहा है। मेरे सर्वर लॉग यह पुष्टि करते हैं कि बाद के समय में सर्वर को पहली बार नहीं कहा जा रहा है।

यही वह है जो मैं कर रहा हूं। मैं एक व्यावसायिक अनुप्रयोग के भीतर से निम्नलिखित कोड का उपयोग कर रहा (इच्छा नहीं है इस आवेदन, शायद मेरी समस्या के लिए प्रासंगिक नहीं उल्लेख करने के लिए):


With CreateObject("MSXML2.XMLHTTP") 
    .open "GET", "http://myserver/cgi-bin/nsr/nsr.cgi?aparam=1", False 
    .send 
    nsrresponse =.responseText 
End With 

वहाँ ऊपर वस्तु पर एक समारोह/विधि कैशिंग बंद करने के लिए है , या यूआरएल बनाने से पहले प्रतिक्रिया ऑब्जेक्ट पर कैशिंग बंद करने के लिए मैं एक विधि/फ़ंक्शन को कॉल कर रहा हूं?

मैंने यहां समाधान के लिए देखा: http://msdn.microsoft.com/en-us/library/ms535874(VS.85).aspx - काफी उपयोगी नहीं है। और यहां: http://www.w3.org/TR/XMLHttpRequest/ - बहुत असभ्य और पढ़ने के लिए मुश्किल है।

मैं भी कैश का उपयोग नहीं HTTP हेडर सेटिंग्स और एचटीएमएल दस्तावेज़ हैडर मेटा डाटा का उपयोग मजबूर करने के लिए कोशिश कर रहा हूँ:

सर्वर साइड पर्ल CGI स्क्रिप्ट कि प्रतिक्रिया बुला ग्राहक के लिए वापस लौट आता है, के

स्निपेट को समाप्ति सेट 0.


    print $httpGetCGIRequest->header(
     -type => 'text/html', 
     -expires => '+0s', 
     ); 

जवाब में HTTP हेडर सेटिंग्स ग्राहक के लिए वापस भेज दिया:


<html><head><meta http-equiv="CACHE-CONTROL" content="NO-CACHE"></head> 
<body> 
response message generated from server 
</body> 
</html> 

ऊपर HTTP शीर्ष लेख और html दस्तावेज़ के शीर्ष सेटिंग्स ज काम नहीं किया, इसलिए मेरा सवाल है।

उत्तर

5

मुझे नहीं लगता कि XMLHTTP ऑब्जेक्ट स्वयं कैशिंग लागू भी करता है।

जैसे ही आप .send() पर कॉल करते हैं, आप एक नया अनुरोध भेजते हैं। कैशिंग का पूरा बिंदु अनुरोध भेजने से बचने के लिए है, लेकिन यह यहां नहीं होता है (जहां तक ​​आपका कोड नमूना जाता है)।

लेकिन यदि ऑब्जेक्ट का उपयोग किसी प्रकार के ब्राउज़र में किया जाता है, तो ब्राउज़र कैशिंग लागू कर सकता है। इस मामले में सामान्य दृष्टिकोण कथन में एक कैश-ब्रेकर शामिल करना है: हर बार जब आप कोई नया अनुरोध करते हैं तो एक यादृच्छिक URL पैरामीटर बदलता है (जैसे, यूआरएल में वर्तमान समय जोड़ना)।

वैकल्पिक रूप से, आप अपने सर्वर को Cache-Control: no-cache, no-store HTTP-header भेज सकते हैं और देख सकते हैं कि इससे मदद मिलती है या नहीं।

<meta http-equiv="CACHE-CONTROL" content="NO-CACHE> शायद बेकार है और आप इसे पूरी तरह से छोड़ सकते हैं।

+0

आपके समय टॉमलाक के लिए बहुत बहुत धन्यवाद। मैंने पाया कि WinHttpRequest.5.1 COM ऑब्जेक्ट कैश नहीं करता है। हालांकि, मुझे आत्मविश्वास हासिल करने के लिए व्यापक परीक्षण करना होगा। अलग-अलग यूआरएल-प्रत्येक-टाइम टिप के लिए +1 - यह निश्चित रूप से विचार करने के लिए एक टिप है - मैं इसका उपयोग कर सकता हूं और साथ ही WinHttpRequest.5.1 और उस अतिरिक्त यूआरएल पैरामीटर से निपटने के लिए हमारे सर्वर का विस्तार कर सकता हूं। मैं शायद उच्च परिशुद्धता के लिए समय-समय पर अनुरोध फ़ील्ड शामिल करूंगा, उदा। मिलीसेक्स शायद। समाधान के हिस्से के रूप में विचार करना निश्चित रूप से लायक है। – therobyouknow

+0

अब आपके यादृच्छिक यूआरएल सुझाव के रूप में स्वीकृत उत्तर मार्ग कारण को हिट करता है - कैशिंग और इसे तोड़ता है ताकि कोड हर बार सर्वर से संपर्क करने के लिए मजबूर हो। – therobyouknow

+1

एक अद्वितीय सत्र आईडी नंबर बनाने के लिए, मैं वीबी फ़ंक्शंस में निर्मित दिनांक और टाइमर का उपयोग कर रहा हूं, एक यादृच्छिक संख्या, पीसी के कंप्यूटर नाम/होस्टनाम के साथ जहां स्क्रिप्ट दिनांक आज की तारीख देता है, टाइमर समय बीत चुका है मिलीसेकेंड। यादृच्छिक संख्या और मशीन आईडी के साथ, यह HTTP GET URL कॉल अद्वितीय बनाना चाहिए। 2 समान यूआरएल कॉल की संभावना शून्य है। – therobyouknow

4

आप WinHTTP का उपयोग कर सकते हैं, जो HTTP प्रतिक्रियाओं को कैश नहीं करता है। SetRequestHeader विधि का उपयोग करके आपको अभी भी कैश नियंत्रण निर्देश (कैश-कंट्रोल: नो-कैश) जोड़ना चाहिए, क्योंकि यह मध्यवर्ती प्रॉक्सी और सर्वर को पहले कैश प्रतिक्रिया वापस नहीं लौटाता है।

+0

तो XMLHTTP ऑब्जेक्ट * कैश अनुरोध करता है *? – Tomalak

+1

असल में, ऐसा नहीं होना चाहिए, जो आपके मूल बिंदु का समर्थन करता है। – Garett

+0

+1 और उत्तर दिया। मैंने WinHttp को देखा और WinHttp.WinHttpRequest.5.1 का उपयोग किया। थोड़ा अतिरिक्त शोध के बाद। आपके सुझाव ने बीज को प्रदान किया, आपको श्रेय दिया। यह सफल है कि कैशिंग नहीं होती है। अब मुझे विश्वास करने के लिए इस स्क्रिप्ट के अपने परीक्षण (जैसे विभिन्न मशीनों/कॉन्फ़िगरेशन) पर विस्तृत करने की आवश्यकता है। क्या कोई कारण है कि इस ऑब्जेक्ट की डिफ़ॉल्ट कैशिंग कॉन्फ़िगरेशन मशीनों के बीच अलग-अलग होगी? – therobyouknow

3

यदि आपके पास XMLHTTP अनुरोध (जो आपके मामले में सत्य है) द्वारा लक्षित एप्लिकेशन पर नियंत्रण है, तो आप इसे प्रतिक्रिया में नो-कैश हेडर भेज सकते हैं। इसने मेरे मामले में इस मुद्दे को हल किया।

Response.AppendHeader("pragma", "no-cache"); 
Response.AppendHeader("Cache-Control", "no-cache, no-store"); 

वैकल्पिक रूप से, आप प्रत्येक अनुरोधित यूआरएल को यादृच्छिक संख्या वाले क्वेरीस्ट्रिंग को भी जोड़ सकते हैं।

संबंधित मुद्दे

 संबंधित मुद्दे