আইজেএজে এজেএক্সের অপ্রত্যাশিত ক্যাচিংয়ের ফলাফল


135

জিকুয়ারি অ্যাজাক্স অনুরোধ থেকে ইন্টারনেট এক্সপ্লোরার ক্যাশে ফলাফলের সাথে আমার একটি গুরুতর সমস্যা হচ্ছে।

আমার ওয়েব পৃষ্ঠায় শিরোনাম রয়েছে যা প্রতিবার ব্যবহারকারী নতুন পৃষ্ঠায় নেভিগেট করে আপডেট হয়। পৃষ্ঠাটি লোড হয়ে গেলে আমি এটি করি

$.get("/game/getpuzzleinfo", null, function(data, status) {
    var content = "<h1>Wikipedia Maze</h1>";
    content += "<p class='endtopic'>Looking for <span><a title='Opens the topic you are looking for in a separate tab or window' href='" + data.EndTopicUrl + "' target='_blank'>" + data.EndTopic + "<a/></span></p>";
    content += "<p class='step'>Step <span>" + data.StepCount + "</span></p>";
    content += "<p class='level'>Level <span>" + data.PuzzleLevel.toString() + "</span></p>";
    content += "<p class='startover'><a href='/game/start/" + data.PuzzleId.toString() + "'>Start Over</a></p>";

    $("#wikiheader").append(content);

}, "json");

এটি কেবল পৃষ্ঠায় শিরোনামের তথ্যকে ইনজেকশন দেয়। আপনি www.wikediamaze.com এ গিয়ে লগ ইন করে এবং নতুন ধাঁধা শুরু করে এটি পরীক্ষা করে দেখতে পারেন ।

প্রতিটি ব্রাউজারে আমি পরীক্ষা করেছি (গুগল ক্রোম, ফায়ারফক্স, সাফারি, ইন্টারনেট এক্সপ্লোরার) এটি আইই ব্যতীত দুর্দান্ত কাজ করে । আইভ্যাথিং প্রথমবারের জন্য ঠিক সূক্ষ্মভাবে ইনজেকশন পায় তবে এর পরে এটি কখনও কল করেও না /game/getpuzzleinfo। এটি ফলাফল বা অন্য কিছুকে ক্যাশে করেছে।

আমি যদি কলটি $.post("/game/getpuzzleinfo", ...IE এ পরিবর্তন করি তবে এটি ঠিক আছে up তবে ফায়ারফক্স কাজ বন্ধ করে দেয়।

কেউ আমার $.getআইজ্যাক কলগুলিতে কেন ক্যাচ করছে সে সম্পর্কে দয়া করে কিছু আলোকপাত করতে পারেন ?

হালনাগাদ

নীচের পরামর্শ অনুযায়ী, আমি আমার এজাক্স অনুরোধটি এতে পরিবর্তন করেছি, যা আমার সমস্যার সমাধান করেছে:

$.ajax({
    type: "GET",
    url: "/game/getpuzzleinfo",
    dataType: "json",
    cache: false,
    success: function(data) { ... }
});

8
এই জিজ্ঞাসা করার জন্য ধন্যবাদ। আমি নির্বাক যে এই ব্রাউজারটি আচরণ করে।
jjohn

1
ভাল প্রশ্ন, এবং সত্যিই দুর্দান্ত ওয়েবসাইট। ভাল ধারণা.
মাইকমুরকো

উত্তর:


177

আইজির অ্যাজাক্স প্রতিক্রিয়াগুলির আক্রমণাত্মক ক্যাচিংয়ের জন্য কুখ্যাত। আপনি jQuery ব্যবহার করার সময়, আপনি একটি বিশ্বব্যাপী বিকল্প সেট করতে পারেন:

$.ajaxSetup({
    cache: false
});

যা jQuery এর অনুরোধ ক্যোয়ারী স্ট্রিংটিতে একটি এলোমেলো মান যুক্ত করবে, যার ফলে IE কে প্রতিক্রিয়াটি ক্যাশে করা থেকে বিরত করবে।

মনে রাখবেন যে আপনি যেখানে অন্যান্য ক্যাচিং চান সেখানে অন্যান্য অজ্যাক্স কলগুলি চলে থাকলে এটি তাদের জন্য এটি অক্ষম করে দেবে। সেক্ষেত্রে $ .ajax () পদ্ধতিটি ব্যবহার করতে স্যুইচ করুন এবং প্রয়োজনীয় অনুরোধের জন্য স্পষ্টভাবে সেই বিকল্পটি সক্ষম করুন।

আরও তথ্যের জন্য http://docs.jquery.com/Ajax/jQuery.ajaxSetup দেখুন ।


1
আপনি আপনার ইউআরএলগুলির শেষে একটি টাইমস্ট্যাম্প যুক্ত করতে পারেন। জিক্যুরি পরিবর্তে এই পদ্ধতির সাথে কেন যায় না তা নিশ্চিত নয়।
এরিক জনসন

14
@ এরিক: এটি jQuery অভ্যন্তরীণভাবে করে - "ক্যাশে: মিথ্যা" বিকল্পটি কেবল এটি করতে বলে।
নিকফিটজ

কেন jquery ডিফল্ট হিসাবে এটি না?
স্পিড প্লেন

আমি কেবল লক্ষ্য করেছি যে আপনি যখন 8 নম্বরে হোম পেজটি অনুরোধ করার চেষ্টা করবেন তখন ক্যাশে বিকল্পগুলি কাজ করে না /। এটিকে /index.phpবা সম্পূর্ণ ইউআরএল যাই হোক না কেন তা পরিবর্তন করুন । অথবা নিজের মতো কিছু জাল প্যারাম যুক্ত করুন/?f=f
হুগো ডেলসিং

8

হিসাবে মার্ট 75 উল্লেখ করেছে, GETএর ক্যাশে করা আছে।

এটি মোকাবেলার জন্য বেশ কয়েকটি উপায় রয়েছে। প্রতিক্রিয়া শিরোনামটি সংশোধন করা ছাড়াও আপনি লক্ষ্যবস্তু URL এর শেষে এলোমেলোভাবে উত্পন্ন উত্পন্ন ক্যোয়ারী স্ট্রিং ভেরিয়েবল যুক্ত করতে পারেন। এই ভাবে, প্রতিবার অনুরোধ করা হলে এটি ভাবেন এটি একটি আলাদা ইউআরএল।

এটি করার একাধিক উপায় রয়েছে (যেমন ব্যবহার Math.random(), তারিখের একটি প্রকরণ ইত্যাদি)।

আপনি এটি করতে পারেন এমন একটি উপায় এখানে:

var oDate = new Date();
var sURL = "/game/getpuzzleinfo?randomSeed=" + oDate.getMilliseconds();
$.get(sURL, null, function(data, status) {
    // your work
});

3

সবসময় ক্যাশেযোগ্য হয় G যে কৌশলটি কাজ করতে পারে তা হ'ল প্রতিক্রিয়া শিরোনাম সম্পাদনা করা এবং ক্লায়েন্টকে তথ্য ক্যাশে না করা বা খুব শীঘ্রই ক্যাশে সমাপ্ত করার কথা বলা।


এটা একটা ভাল ধারণা মত শোনাচ্ছে। আমি কীভাবে এটি করতে যাব?
মাইকা

1
এটি আপনার বোঝার প্রশ্ন, আপনার সার্ভারের পাশের কোডের উপর নির্ভর করে। কিছুটা গাইডেন্সের জন্য উইকিপিডিয়া এন্ট্রি "HTTP শিরোনামের তালিকা" দেখুন। উদাহরণস্বরূপ: ক্যাশে-নিয়ন্ত্রণ: নো-ক্যাশে মেয়াদোত্তীর্ণ: থু, 01 ডিসেম্বর 1994 16:00:00 GMT মূলত আপনাকে এই পোস্টের প্রতিক্রিয়াতে এই প্রতিক্রিয়া শিরোনামগুলি যুক্ত করতে হবে। এটি ASP.NET, রুবি এবং PHP এ মোটামুটি সহজ। আপনি যে সার্ভারের সাইড ল্যাঙ্গুয়েজটি ব্যবহার করছেন + প্রতিক্রিয়া শিরোনামগুলি সংশোধন করুন।
marr75

3
এছাড়াও, এবং এটি জ্যাকুরির সমালোচনা নয় (আমি সেই লাইব্রেরিটি পছন্দ করি), এলোমেলো ক্যোয়ারী স্ট্রিং প্যারামিটার যুক্ত করার পদ্ধতিটি নিরাপদ তবে ক্লায়েন্টের কাছে অসম্পূর্ণ (এটি তাদের ক্যাশে আইটেম ধরে রাখতে পারে যা কখনও ব্যবহার করা হবে না) আবার)।
marr75

2

আপনি যদি অ্যাশএক্স পৃষ্ঠাটিতে কল করছেন তবে আপনি নিম্নলিখিত কোড সহ সার্ভারে ক্যাচিং অক্ষম করতে পারেন:

context.Response.Cache.SetCacheability(HttpCacheability.NoCache);
context.Response.Cache.SetRevalidation(HttpCacheRevalidation.AllCaches); 

1

এজাক্স কলগুলির জন্য আমি এটিই করি:

var url = "/mypage.aspx";
// my other vars i want to add go here
url = url + "&sid=" + Math.random();
// make ajax call

এটা আমার জন্য বেশ ভাল কাজ করে।


1

নিকফিটস একটি ভাল উত্তর দেয়, তবে আপনাকে IE9 এও ক্যাচিং বন্ধ করতে হবে। কেবল আইই 8 এবং আইই 9 কে লক্ষ্য করার জন্য আপনি এটি করতে পারেন;

<!--[if lte IE 9]>
<script>
    $.ajaxSetup({
        cache: false
    });
</script>
<![endif]-->

0

যারা উত্তরগুলি jQuery ব্যবহার করেন বা কোনও কারণে সরাসরি xMLHttpRequest অবজেক্ট ব্যবহার করেন তাদের জন্য এখানে উত্তরগুলি খুব সহায়ক ...

আপনি যদি স্বয়ংক্রিয়ভাবে উত্পাদিত মাইক্রোসফ্ট পরিষেবা প্রক্সি ব্যবহার করেন তবে এটি সমাধান করা এত সহজ নয়।

কৌশলটি হ'ল ইভেন্ট হ্যান্ডলারটিতে সিস.নেট.উইবআরউকুয়েস্টম্যানেজ.আরডি_ইনকোইকিংয়ের পদ্ধতিটি ব্যবহার করার অনুরোধটি ইউআরএল পরিবর্তন করুন:

networkRequestEventArgs._webRequest._url = networkRequestEventArgs._webRequest._url + '&nocache=' + new Date().getMilliseconds(); 

আমি এই সম্পর্কে ব্লগ করেছি: http://yoavniran.wordpress.com/2010/04/27/ie-caching-ajax-results-how-to-fix/


0

কেবল মাত্র এক্সট্রাএস ( http://thecodeabode.blogspot.com/2010/10/cache-busting-ajax-requests-in-ie.html ) ব্যবহার করে এই সঠিক সমস্যাটিতে একটি ব্লগ লিখেছিলেন

সমস্যাটি ছিল কারণ আমি একটি নির্দিষ্ট ইউআরএল পুনর্লিখনের ফর্ম্যাটটি ব্যবহার করছিলাম আমি প্রচলিত ক্যোয়ারী স্ট্রিং প্যারামগুলি (? প্যারাম = মান) ব্যবহার করতে পারি না, সুতরাং আমি পরিবর্তিত পোস্ট হিসাবে ক্যাশে বুস্টিং প্যারামিটারটি লিখেছিলাম ..... আমি ভাবতাম পোষ্ট ভেরিয়েবলগুলি ব্যবহার করা কিছুটা নিরাপদ যে কেবল এমভিসি ফ্রেমওয়ার্কগুলি প্যাটার্ন ব্যবহার করে

প্রোটোকল: // হোস্ট / নিয়ামক / কর্ম / PARAM1 / PARAM2

এবং তাই ভেরিয়েবলের নামের সাথে মানটির মানচিত্রটি হারিয়ে যায় এবং প্যারামগুলি কেবল স্ট্যাক করা হয় ... সুতরাং যখন জিইটি ক্যাশে বুস্টার প্যারামিটার ব্যবহার করা হয়

অর্থাত্ প্রোটোকল: // হোস্ট / নিয়ন্ত্রক / ক্রিয়া / প্যারাম 1 / প্যারাম 2 / ন_ক্যাচ 122300201

no_cache122300201 একটি $ প্যারাম 3 প্যারামিটারের জন্য ভুল হতে পারে যার ডিফল্ট মান থাকতে পারে

অর্থাত

পাবলিক ফাংশন অ্যাকশন ($ param1, $ param2, $ param3 = "ডিফল্ট মান") {//..//}

পোস্ট করা ক্যাশে বাস্টারদের সাথে এমনটি হওয়ার কোনও সম্ভাবনা নেই


0

আপনি যদি এএসপি.নেট এমভিসি ব্যবহার করে থাকেন তবে নিয়ামক ক্রিয়াকলাপের উপরে এই লাইনটি যুক্ত করা যথেষ্ট:

[OutputCache(NoStore=true, Duration = 0, VaryByParam = "None")]
public ActionResult getSomething()
{

}

প্রশ্নে আচরণটি ব্রাউজারের দিকে; এই উত্তরটি সার্ভারের দিকে ক্যাশে সম্পর্কিত।
মার্ক সোওুল

@ মার্কসৌল আউটপুট ক্যাশেতে 3 টি বিকল্প ক্লায়েন্ট, সার্ভার এবং যে কোনও আছে। আইই আউটপুট ক্যাশে ডিফল্ট হিসাবে ব্যবহার করে যা বেশিরভাগ ক্লায়েন্ট সাইড ক্যাচিং হিসাবে যায়। আপনি আরও বিশদটি এখানে দেখতে পারেন ডগউইলসোনস.ওয়ার্ডপ্রেস.কম
২০১০ /

@ মারকসোউল আপনি এখানে সম্পর্কিত প্রশ্নোত্তরও দেখতে পারেন। আপনি কি মনে করেন এটিও সার্ভারে রয়েছে? stackoverflow.com/questions/2653092/...
batmaci

1
হ্যাঁ, দুঃখিত, আপনি ঠিক বলেছেন - আমি বুঝতে পারি নি যে আপনার উত্তরটি সার্ভার-সাইড ক্যাশে এবং ক্লায়েন্ট-সাইড ক্যাশে উভয়কেই প্রভাবিত করতে পারে ।
সোয়ুল

-1

আইই এই ক্যাচিংটি করার অধিকারের মধ্যে রয়েছে; আইটেমটি ক্যাশে না হয়েছে তা নিশ্চিত করতে শিরোনামগুলি সেই অনুযায়ী সেট করা উচিত।

আপনি যদি এএসপি.নেট এমভিসি ব্যবহার করেন তবে আপনি একটি লিখতে পারেন ActionFilter; ইন OnResultExecuted, চেক filterContext.HttpContext.Request.IsAjaxRequest()। যদি তা হয় তবে প্রতিক্রিয়াটির মেয়াদ শেষ হবে:filterContext.HttpContext.Response.Expires = -1;

অনুযায়ী http://www.dashbay.com/2011/05/internet-explorer-caches-ajax/ :

কিছু লোক ক্যাশে - নিয়ন্ত্রণ: না - ক্যাশে শিরোনাম পরিবর্তে শিরোনাম ব্যবহার করতে পছন্দ করে। এখানে পার্থক্যটি রয়েছে:
ক্যাশে-নিয়ন্ত্রণ: নো-ক্যাশে - একেবারে কোনও ক্যাশিংয়ের
মেয়াদ শেষ নয়: -১ - ব্রাউজারটি "সাধারণত" শর্তাধীন যদি-সংশোধিত-অনুরোধের মাধ্যমে সেই পৃষ্ঠায় আপডেট করার জন্য ওয়েব সার্ভারের সাথে যোগাযোগ করে। তবে পৃষ্ঠাটি ডিস্ক ক্যাশে থেকে যায় এবং রিমোট ওয়েব সার্ভারের সাথে যোগাযোগ না করে যথাযথ পরিস্থিতিতে ব্যবহৃত হয়, যেমন নেভিগেশন ইতিহাস অ্যাক্সেস করার জন্য যখন ব্যাক এবং ফোরওয়ার্ড বোতামগুলি ব্যবহার করা হয় বা ব্রাউজারটি অফলাইন মোডে থাকে তখন।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.