Ular HTTP এর জন্য কৌণিক আইই ক্যাচিংয়ের সমস্যা


251

আইই থেকে প্রেরিত সমস্ত এজাক্স কলগুলি কৌনিক দ্বারা ক্যাশেড হয় এবং 304 responseপরবর্তী সমস্ত কলগুলির জন্য আমি একটি পাই । যদিও অনুরোধটি একই, আমার ক্ষেত্রে প্রতিক্রিয়া একই রকম হচ্ছে না। আমি এই ক্যাশেটি অক্ষম করতে চাই। আমি cache attribute$ http.get এ যোগ করার চেষ্টা করেছি কিন্তু তবুও এটি কোনও লাভ হয়নি। কীভাবে এই সমস্যা সমাধান করা যেতে পারে?

উত্তর:


439

প্রতিটি একক জিইটি-অনুরোধের জন্য ক্যাচিং অক্ষম করার পরিবর্তে, আমি $ এইচটিপি প্রাইভাইডারে এটি বিশ্বব্যাপী অক্ষম করে:

myModule.config(['$httpProvider', function($httpProvider) {
    //initialize get if not there
    if (!$httpProvider.defaults.headers.get) {
        $httpProvider.defaults.headers.get = {};    
    }    

    // Answer edited to include suggestions from comments
    // because previous version of code introduced browser-related errors

    //disable IE ajax request caching
    $httpProvider.defaults.headers.get['If-Modified-Since'] = 'Mon, 26 Jul 1997 05:00:00 GMT';
    // extra
    $httpProvider.defaults.headers.get['Cache-Control'] = 'no-cache';
    $httpProvider.defaults.headers.get['Pragma'] = 'no-cache';
}]);

78
If-Modified-Sinceহেডার তোলে + + iisnode থ্রো মাধ্যমে লোড প্রত্যেক এইচটিএমএল ফাইলের জন্য 400 ত্রুটিযুক্ত অনুরোধ আইআইএস ngIncludeএবং ngView। নিম্নলিখিত দুটি শিরোনাম আমার জন্য সমস্যাটি স্থির করেছেন (যদিও আমি তাদের ক্রোম থেকে টেনেছি, যার ক্যাশে সমস্যা নেই): $httpProvider.defaults.headers.get['Cache-Control'] = 'no-cache'; $httpProvider.defaults.headers.get['Pragma'] = 'no-cache';
ল্যাংডন

4
আমার মতে এই উত্তরটি উত্তর হিসাবে চিহ্নিত করা উচিত, যখন মার্টিনের প্রদত্ত সমাধান কাজ করে, এটি একটি বাস্তবের চেয়ে আরও বেশি হ্যাক।
রব্বা

4
এটি আমার স্থানীয় জিইটি অনুরোধগুলির জন্য কাজ করেছে, তবে এটি জিইটি পদ্ধতির পরিবর্তে অপশন বিকল্পটি ব্যবহার করা শুরু করার জন্য একটি কর সিআরএস অনুরোধ করেছে। 3 য় পক্ষের সার্ভার অপশন পদ্ধতিটিকে সমর্থন করে না, সুতরাং আমার অনুরোধটিটি অনুরোধ করতে jQuery.get () ব্যবহার করতে হবে এবং প্রতিক্রিয়া হ্যান্ডলারে $ স্কোপ.অ্যাপ্লি () ব্যবহার করবে।
বেন

13
If-Modified-Since = "0"শিরোলেখের ব্যবহার টমক্যাটকে ব্রেক করে (শিরোনামের তারিখ পার্স করার ক্ষেত্রে সমস্যা, যেমনটি 0মান মান আরএফসি নয় )। Mon, 26 Jul 1997 05:00:00 GMTপরিবর্তে মান ব্যবহার করে স্থির ।
লোপিসান

6
আমি "যদি-সংশোধিত-যেহেতু" শিরোনাম ব্যবহার করি না এবং এটি ছাড়া এটি কাজ করে। শুধু অন্য দুটি প্রয়োজনীয়।
মাইকেল মাহনি

69

আপনি অনুরোধটিতে একটি অনন্য ক্যোরিস্ট্রিং যুক্ত করতে পারেন (আমি বিশ্বাস করি jQuery ক্যাশে: মিথ্যা বিকল্পের সাথে এটি করে)।

$http({
    url: '...',
    params: { 'foobar': new Date().getTime() }
})

একটি সম্ভবত আরও ভাল সমাধান যদি আপনার সার্ভারে অ্যাক্সেস থাকে তবে আপনি নিশ্চিত করতে পারেন যে প্রয়োজনীয় শিরোনাম ক্যাচিং প্রতিরোধের জন্য সেট করা আছে। আপনি যদি ASP.NET MVC এই উত্তরটি ব্যবহার করেন তবে এটি সাহায্য করতে পারে।


2
$http.get(url+ "?"+new Date().toString())প্যারামিটার ব্যবহার না করে ক্যোরি স্ট্রিংয়ে এটি যুক্ত না করে কেবল অন্য একটি উপস্থাপনা।
দাভুত গার্বিজ

28

আপনি একটি বিরতি যুক্ত করতে পারেন।

myModule.config(['$httpProvider', function($httpProvider) {
 $httpProvider.interceptors.push('noCacheInterceptor');
}]).factory('noCacheInterceptor', function () {
            return {
                request: function (config) {
                    console.log(config.method);
                    console.log(config.url);
                    if(config.method=='GET'){
                        var separator = config.url.indexOf('?') === -1 ? '?' : '&';
                        config.url = config.url+separator+'noCache=' + new Date().getTime();
                    }
                    console.log(config.method);
                    console.log(config.url);
                    return config;
               }
           };
    });

যাচাই করার পরে আপনার কনসোল.লগ লাইনগুলি সরানো উচিত।


আপনি $logযদি এগুলি বের করতে ভুলে যান তবে আপনার ব্যবহার করা উচিত ।
কার্ল জি

2
আইইতে আমার গুরুতর ক্যাচিং সমস্যা হচ্ছে, যা ফাঁকা পৃষ্ঠাতে নিয়ে যায়, কারণ গুরুত্বপূর্ণ অংশগুলি কার্যকর হয় নি। প্রস্তাবিত ইন্টারসেপ্টর ব্যবহার করে এই সমস্যার সমাধান! +1
রাউলিনস্কি

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

@ দিলিপ পট্টনায়েক: - কেন এই সমস্যাটি কৌনিক এবং সাথে হয়?
মিহক

14

আমি কৌণিক প্রকল্পে কেবল সূচক html এ তিনটি মেটা ট্যাগ যুক্ত করেছি এবং আই-তে ক্যাশে সমস্যা সমাধান করা হয়েছে।

<meta http-equiv="Pragma" content="no-cache">
<meta http-equiv="Cache-Control" content="no-cache">
<meta http-equiv="Expires" content="Sat, 01 Dec 2001 00:00:00 GMT">

2
আমাদের কাছে ইতিমধ্যে সেই মেটা ট্যাগগুলি ছিল index.htmlযখন আমরা লক্ষ্য করেছি যে আইই 11 এজেএক্স অনুরোধগুলি ক্যাশে করছে: / তবে $httpProviderঅন্যান্য উত্তরে দেখানো হয়েছে কনফিগারেশনটি ঠিক কাজ করেছিল।
ওয়ালেন

14

আমার উত্তরটি অন্য থ্রেডে অনুলিপি করা হচ্ছে ।

জন্য কৌণিক 2 এবং নতুন , সবচেয়ে সহজ উপায় যোগ করার জন্য no-cacheঅগ্রাহ্য দ্বারা হেডার RequestOptions:

import { Injectable } from '@angular/core';
import { BaseRequestOptions, Headers } from '@angular/http';

@Injectable()
export class CustomRequestOptions extends BaseRequestOptions {
    headers = new Headers({
        'Cache-Control': 'no-cache',
        'Pragma': 'no-cache',
        'Expires': 'Sat, 01 Jan 2000 00:00:00 GMT'
    });
}

এবং এটি আপনার মডিউলটিতে উল্লেখ করুন:

@NgModule({
    ...
    providers: [
        ...
        { provide: RequestOptions, useClass: CustomRequestOptions }
    ]
})

সেগুলি কি সার্ভারের প্রতিক্রিয়ার জন্য হেডার হবে না, ব্রাউজারের অনুরোধের জন্য নয়? (আমি ভাবতে পারি If-Modified-Sinceযে উপরের পদ্ধতিটি ব্যবহার করে কেউ অতীতে অনেক তারিখ নির্ধারণ করতে পারে ))
আরজান

@ ভিটিলিয়: - কেন এই সমস্যাটি কৌনিক এবং সাথে হয়?
মিহউক

আপনার দৃষ্টিভঙ্গি ইতিমধ্যে বিদ্যমান যে কোনও কাস্টম শিরোলেখ অপসারণ করবে। সুতরাং নতুন হেডার অবজেক্ট তৈরি না করে নিম্নলিখিতটি করুন। headers: req.headers .set('Cache-Control', 'no-cache') .set('Pragma', 'no-cache') .set('Expires', 'Sat, 01 Jan 2000 00:00:00 GMT')
চামিকা গুঁটিটিলাকা

9

আমি যে গ্যারান্টিযুক্ত কাজ করেছি তা হ'ল এই লাইনের সাথে কিছু ছিল:

myModule.config(['$httpProvider', function($httpProvider) {
    if (!$httpProvider.defaults.headers.common) {
        $httpProvider.defaults.headers.common = {};
    }
    $httpProvider.defaults.headers.common["Cache-Control"] = "no-cache";
    $httpProvider.defaults.headers.common.Pragma = "no-cache";
    $httpProvider.defaults.headers.common["If-Modified-Since"] = "Mon, 26 Jul 1997 05:00:00 GMT";
}]);

আমি সব পদ্ধতি জন্য সঠিক ব্যবহার গ্যারান্টি উপরে সমাধানের 2 একত্রীকরণ ছিল, কিন্তু আপনি প্রতিস্থাপন করতে পারেন commonসঙ্গে getবা অন্যান্য পদ্ধতি অর্থাত put, post, deleteবিভিন্ন ক্ষেত্রে এই কাজটি করতে পারেন।


আপনি কি কোডটিতে আপনি এঙ্গুলার.জেএস ফাইলটিতে যুক্ত করেছেন আমাকে বলতে পারেন? কোন লাইন #?
JonathanScialpi

@ জোনাথানসিসিপি আমি এটি কোথায় রেখেছি তা দেখানোর জন্য এটি আপডেট করেছি। এটি যেখানে বেনামে ফাংশন রয়েছে তার মধ্যে কিছু আসে যায় না।
marksyzm

@ মার্কসিজম আপনি কি আমাকে এই লাইনের অর্থ বলতে পারেনif (!$httpProvider.defaults.headers.get) { $httpProvider.defaults.headers.common = {}; }
মনোজিৎ সরকার

@ মনোজিত সরকার আহ, যদি এই বিবৃতিতে শিরোনাম.কম হওয়ার কথা ছিল, সেই পয়েন্টারের জন্য ধন্যবাদ
মার্কসিজম

1
["If-Modified-Since"] = "0"অবৈধ এবং কিছু পিছনে খারাপ অনুরোধ উত্পন্ন সহ। এটি একটি তারিখ হওয়া উচিত।
জেনসন-বাটন-ইভেন্ট

8

এই একমাত্র লাইনটি আমাকে সহায়তা করেছে (কৌণিক 1.4.8):

$httpProvider.defaults.headers.common['Pragma'] = 'no-cache';

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


1
শুধু এফওয়াইআই, আজুরের ব্লব স্টোরেজ থেকে ফাইলগুলি অনুরোধ করার সময় এই উত্তরটি একটি সিওআরএস সমস্যার কারণ হয়ে দাঁড়িয়েছিল, ট্র্যাক ডাউন করা কঠিন ছিল কিন্তু অবশেষে এই কারণটি খুঁজে পেয়েছিল। প্রগমা শিরোলেখ অপসারণ করে আমার সিওআরএস ইস্যুটি সংশোধন করা হয়েছে (তবে আইই ক্যাচিংয়ের সমস্যাটি পুনরায় ইনস্টল করা হয়েছে)।
keithl8041

7

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

myURL = myURL +"?random="+new Date().getTime();

6

আমি এটি এলোমেলো সংখ্যা হিসাবে ডেটটাইম যোগ করার সমাধান করেছি:

$http.get("/your_url?rnd="+new Date().getTime()).success(function(data, status, headers, config) {
    console.log('your get response is new!!!');
});

: - কেন এই সমস্যাটি কৌনিক এবং সাথে হয়?
মিহক

4

উপরের সলিউশনটি কাজ করবে (ক্যোরিস্টিংকে নতুন প্যারাম যুক্ত করে ইউআরএলটিকে অনন্য করে তুলবে) তবে আমি সমাধানটির প্রস্তাবটি [এখানে] পছন্দ করি: অ্যাংুলারজেএসে আইআই ক্যাশে প্রতিরোধের আরও ভাল উপায়? , যা এটি সার্ভার স্তরে হ্যান্ডেল করে কারণ এটি আইইয়ের সাথে নির্দিষ্ট নয়। আমার অর্থ, যদি সেই সংস্থানটি ক্যাশে না করা হয় তবে সার্ভারে এটি করুন (এটি ব্যবহৃত ব্রাউজারের সাথে কিছুই করার মতো নয়; এটি উত্সটির অন্তর্নিহিত)।

JAX-RS এর সাথে জাভা উদাহরণস্বরূপ এটি JAX-RS v1 এর জন্য প্রোগ্রামে বা JAX-RS v2 এর জন্য ঘোষিত হিসাবে করুন।

আমি নিশ্চিত যে এটি কীভাবে করবেন তা কেউ বুঝতে পারবে


1
যদিও এটি বিশদভাবে ব্যাখ্যা করা যায়, এটি এটি করার সঠিক উপায়। ক্লায়েন্টের পক্ষ থেকে কী ক্যাশে রাখতে হবে তা বেছে নেওয়া উচিত নয়, তবে এটি সার্ভার হওয়া উচিত যা ক্লায়েন্টকে ক্যাশে করা উচিত বা কী করা উচিত তা জানান tell
আর্কিমিডস ট্রাজানো

আমি পুরোপুরি সম্মত, এটি অবশ্যই একটি সঠিক উপায় হতে হবে
smnbbrv

1

এটি পুরানো থেকে কিছুটা হলেও: সমাধানগুলি অচল। সার্ভারকে ক্যাশে হ্যান্ডেল করুন বা না ক্যাশে (প্রতিক্রিয়াতে)। কোনও ক্যাশিং গ্যারান্টি দেওয়ার একমাত্র উপায় (উত্পাদনের নতুন সংস্করণ সম্পর্কে চিন্তাভাবনা) হ'ল একটি সংস্করণ নম্বর সহ জেএস বা সিএসএস ফাইল পরিবর্তন করা। আমি এটি ওয়েবপ্যাক দিয়ে করি।


1

এছাড়াও আপনি উদাহরণস্বরূপ শিরোনাম সেট করতে আপনার সার্ভেতে চেষ্টা করতে পারেন:

...
"@ কৌনিক / মূল" থেকে import ইনজেকটেবল} আমদানি করুন;
"@ কৌণিক / সাধারণ / HTTP" থেকে আমদানি করুন {এইচটিটিপিকলেন্ট, এইচটিপিএইচইডারস, এইচটিটিপিপ্যারামস;
...
 @Injectable ()
রফতানি ক্লাস মাই সার্ভিস {

    ব্যক্তিগত শিরোনাম: এইচটিপিএইচডার্স;


    কনস্ট্রাক্টর (প্রাইভেট http: HttpClient ..) 
    {


        this.headers = নতুন এইচটিপিএইচডার্স ()
                    .পেন্ড ("বিষয়বস্তুর ধরণ", "অ্যাপ্লিকেশন / জেসন")
                    .পেন্ড ("স্বীকার করুন", "অ্যাপ্লিকেশন / জেসন")
                    .পেন্ড ("ল্যাঙ্গুয়েজ কালচার", এটি.হেডার্স ল্যাঙ্গুয়েজ)
                    .পেন্ড ("ক্যাশে-নিয়ন্ত্রণ", "নো-ক্যাশে")
                    .পেন্ড ("প্রগমা", "নো-ক্যাশে")                   
    }
}
....


0

এই সমস্যাটি আইই ক্যাচিংয়ের সমস্যার কারণ হিসাবে আপনি বলেছিলেন, আপনি এটিকে আই 12 ডিবাগ মোডে পরীক্ষা করতে পারবেন f12 টিপুন (এটি ডিবাগ মোডে ভাল কাজ করবে) I প্রতিবার পৃষ্ঠাটি কল করার সময় আমি সার্ভার ডেটা নেব না, এটি লাগে ক্যাশে থেকে ডেটা। এটি অক্ষম করতে নিম্নলিখিতগুলির মধ্যে যেকোন একটি করুন:

  1. আপনার HTTP পরিষেবা অনুরোধ url সহ নিম্নলিখিতগুলি যুক্ত করুন

// আগে (একটি জারি করা হয়েছে)

this.httpService.get (this.serviceUll + "/eAmobileService.svc/ValidateEngagmentName/" + বাগদানের নাম, {})

// পরে (ভাল কাজ করে)

this.httpService.get (this.serviceUll + "/eAmobileService.svc/ValidateEngagmentName/" + বাগদানের নাম + "? তারিখটাইম =" + নতুন তারিখ ()। গেটটাইম () + '', {ক্যাশে: মিথ্যা})

  1. পুরো মডিউলটির জন্য ক্যাশে অক্ষম করুন: -

; httpProvider.defaults.headers.common ['প্রগমা'] = 'নো-ক্যাশে';



0

একটি বিকল্প হ'ল প্রতিটি অনুরোধের সাথে টাইমস্ট্যাম্প যুক্ত করার সহজ পদ্ধতির ব্যবহার করা ক্যাশে সাফ করার দরকার নেই।

    let c=new Date().getTime();
    $http.get('url?d='+c)

-2

এটি চেষ্টা করে দেখুন, এটি আমার জন্য অনুরূপ ক্ষেত্রে কাজ করেছে: -

$http.get("your api url", {
headers: {
    'If-Modified-Since': '0',
    "Pragma": "no-cache",
    "Expires": -1,
    "Cache-Control": "no-cache, no-store, must-revalidate"
 }
})
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.