পুরো ASP.NET ওয়েবসাইটের জন্য ব্রাউজার ক্যাশে অক্ষম করুন


199

পুরো ASP.NET MVC ওয়েবসাইটের জন্য ব্রাউজার ক্যাশে অক্ষম করার জন্য আমি একটি পদ্ধতির সন্ধান করছি

আমি নিম্নলিখিত পদ্ধতিটি পেয়েছি:

Response.Cache.SetCacheability(System.Web.HttpCacheability.NoCache);
Response.Cache.SetNoStore();

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

<meta http-equiv="PRAGMA" content="NO-CACHE">

তবে আমি একটি সম্পূর্ণ ওয়েবসাইটের জন্য ব্রাউজার ক্যাশে অক্ষম করার জন্য একটি সহজ পদ্ধতির সন্ধান করছি।


উত্তর:


92
HttpContext.Current.Response.Cache.SetExpires(DateTime.UtcNow.AddDays(-1));
HttpContext.Current.Response.Cache.SetValidUntilExpires(false);
HttpContext.Current.Response.Cache.SetRevalidation(HttpCacheRevalidation.AllCaches);
HttpContext.Current.Response.Cache.SetCacheability(HttpCacheability.NoCache);
HttpContext.Current.Response.Cache.SetNoStore();

সমস্ত অনুরোধগুলি প্রথমে ডিফল্ট.এএসপিএক্স এর মাধ্যমে রুট হয়ে যায় - সুতরাং ধরে নিই আপনি কেবল কোডটির পিছনে পপ করতে পারেন।


17
আমি এটিকে অ্যাপ্লিকেশন_বিগেনরেক্সেস্ট () -তে গ্লোবাল.এক্সএক্স.এস.-এ রেখে দেব। আমি এই ডিফল্ট.এএসপিএক্স জিনিসটিকে বিশ্বাস করি না ... আরেকটি প্রশ্ন: এটির কি [আউটপুট ক্যাশে] বৈশিষ্ট্যগুলির চেয়ে প্রাধান্য রয়েছে?
chris166

5
এই জিনিসটি সেভাবে রেখে কেবল একটি গ্লোবাল অ্যাকশন ফিল্টার তৈরির ধারণাটি আমার পছন্দ হয়। ডিফল্ট.এএসপিএক্স এবং গ্লোবাল.অ্যাক্সেক্স নিয়ে উদ্বেগের দরকার পড়েন।
কিথ অ্যাডলার

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

4
প্রোগ্রামগতভাবে কিছু ব্যবহার করা সর্বদা যে কোনও ঘোষিত অ্যাট্রিবিউটকে ওভাররাইড করে। অন্য কথায়, ওপির কোড ব্যবহার করা কোনও ঘোষিত [আউটপুটক্যাচী] বৈশিষ্ট্যকে ওভাররাইড করবে।
ডেভ ব্ল্যাক

কীভাবে পরীক্ষার ধূমপান করা উচিত এবং ক্যাশে অক্ষম করা বাস্তবে কাজ করে তা যাচাই করবেন কীভাবে?
Paaone

366

IActionFilter থেকে উত্তরাধিকার সূত্রে একটি বর্গ তৈরি করুন।

public class NoCacheAttribute : ActionFilterAttribute
{  
    public override void OnResultExecuting(ResultExecutingContext filterContext)
    {
        filterContext.HttpContext.Response.Cache.SetExpires(DateTime.UtcNow.AddDays(-1));
        filterContext.HttpContext.Response.Cache.SetValidUntilExpires(false);
        filterContext.HttpContext.Response.Cache.SetRevalidation(HttpCacheRevalidation.AllCaches);
        filterContext.HttpContext.Response.Cache.SetCacheability(HttpCacheability.NoCache);
        filterContext.HttpContext.Response.Cache.SetNoStore();

        base.OnResultExecuting(filterContext);
    }
}

তারপরে যেখানে প্রয়োজন সেখানে বৈশিষ্ট্যগুলি রাখুন ...

[NoCache]
[HandleError]
public class AccountController : Controller
{
    [NoCache]
    [Authorize]
    public ActionResult ChangePassword()
    {
        return View();
    }
}

19
HttpContext.Current.Response এর পরিবর্তে, আপনি সম্ভবত ফিল্টারকন্টেক্সট ব্যবহার করুন। HttpContext.Response যেহেতু HttpContext.Cਵਰেন্ট প্রি-এমভিসি এইচটিটিপেক্সটেক্সট অবজেক্ট এবং ফিল্টারকন্টেক্সট ফেরত দেয় H এটি পরীক্ষাযোগ্যতা এবং ধারাবাহিকতা বৃদ্ধি করে।
মেকডববস

5
আইএ্যাকশনফিলারটি ইতিমধ্যে অ্যাকশনফিলারঅ্যাট্রিবিউটে প্রয়োগ করা হয়েছে, সুতরাং আপনার এটি পুনরাবৃত্তি করার দরকার নেই।
অ্যান্ড্রু ডেভি

104
এএসপি.নেট এমভিসির বর্তমান সংস্করণগুলিতে আপনি ক্যাচিং প্রতিরোধের জন্য আউটপুটক্যাচিট্রিবিউটটি কেবল ব্যবহার করতে পারেন: [আউটপুট ক্যাশে (নস্টোর = সত্য, সময়কাল = 0, ভ্যারিবিপরাম = "কিছুই নয়")]
অ্যাশলে টেট

9
আমি এটি উল্লেখ করতে চাই যে এএসপি.নেট এমভিসি-র জন্য সূর্যের নীচে "এই কোডটিকে আপনার কোডে রেখে দেওয়া" সমাধানটি ব্যবহার করে আমি কেবল বেশ কয়েকটি দিন ব্যয় করেছি, এই প্রশ্নের গ্রহণযোগ্য উত্তর সহ কোনও ফলসই হয়নি। এই উত্তর - গুণ - কাজ। +1M Rep যদি আমি পারতাম ...
টম কিড

5
আপনি if (filterContext.IsChildAction) return;শীর্ষে যুক্ত করতে চাইতে পারেন - এটি যদি কোনও শিশুকে NoCacheঅ্যাট্রিবিউট দিয়ে সজ্জিত অ্যাকশন হিসাবে কল করে তবে এটি বাহ্যিক ক্রিয়াকে 'কোনও ক্যাশেড' হতে বাধা দেবে । অন্য কথায় NoCacheঅ্যাট্রিবিউট অন্য ক্রিয়ায় ফাঁস হবে না যদি তারা সন্তানের ক্রিয়া সম্পাদন করে। এছাড়াও, শ্রেণীর নামটি NoCacheAttributeবৈশিষ্ট্যের জন্য সাধারণত গৃহীত নামকরণ কনভেনশন মেনে চলতে হবে ।
জাকুব কোনেক্কি

132

নিজের ঘূর্ণায়মান পরিবর্তে, আপনার জন্য সরবরাহ করা কেবল ব্যবহার করুন।

পূর্বে উল্লিখিত হিসাবে, সমস্ত কিছুর জন্য ক্যাশে অক্ষম করবেন না। উদাহরণস্বরূপ, এএসপি.নেট এমভিসিতে প্রচুর পরিমাণে ব্যবহৃত jQuery স্ক্রিপ্টগুলি ক্যাশে করা উচিত। আসলে আদর্শভাবে আপনার যাহাই হউক না কেন তাদের জন্য সিডিএন ব্যবহার করা উচিত তবে আমার বক্তব্যটি কিছু বিষয়বস্তুতে ক্যাশে হওয়া উচিত।

আমি [আউটপুটক্যাচ] সর্বত্র ছড়িয়ে দেওয়ার চেয়ে এখানে যা ভাল কাজ করি তা হল একটি শ্রেণি ব্যবহার করা:

[System.Web.Mvc.OutputCache(NoStore = true, Duration = 0, VaryByParam = "*")]
public class NoCacheController  : Controller
{
}

আপনার যে সমস্ত কন্ট্রোলার আপনার জন্য ক্যাশে অক্ষম করতে চান তারপরে এই নিয়ামকের কাছ থেকে উত্তরাধিকারী।

আপনার যদি NoCacheController ক্লাসে ডিফল্টগুলি ওভাররাইড করার দরকার হয় তবে আপনার ক্রিয়া পদ্ধতিতে কেবল ক্যাশে সেটিংস নির্দিষ্ট করুন এবং আপনার অ্যাকশন পদ্ধতির সেটিংস অগ্রাধিকার নেবে।

[HttpGet]
[OutputCache(NoStore = true, Duration = 60, VaryByParam = "*")]
public ViewResult Index()
{
  ...
}

4
@ ওজিপিপস, আপনার মন্তব্যটি সঠিক নয়। এমএসডিএন ডক্স ব্রাউজারের ক্যাচিংয়ের পাশাপাশি একটি সাধারণ পরীক্ষা নিয়ে আলোচনা করে এই বৈশিষ্ট্যটি "ক্যাশে-নিয়ন্ত্রণ: পাবলিক, নো-স্টোর, সর্বাধিক বয়স = 0" "ক্যাশে-নিয়ন্ত্রণ: ব্যক্তিগত" ছাড়াই ক্যাশে-নিয়ন্ত্রণ প্রতিক্রিয়া শিরোনামকে পরিবর্তন করে দেখায় বৈশিষ্ট্য ব্যবহার করে।
অ্যাডাম টিউলিপার - এমএসএফটি

2
এছাড়াও ফাই - আপনি এই বৈশিষ্ট্যটি সহ তিনটি অবস্থানই (সার্ভার, প্রক্সি, ক্লায়েন্ট) নিয়ন্ত্রণ করতে পারেন যাতে সার্ভার ক্যাশে ছাড়াই একেবারে নিয়ন্ত্রণ করতে পারে। কিছু অতিরিক্ত বিবরণের জন্য asp.net/mvc/tutorials/… দেখুন
অ্যাডাম টিউলিপার - এমএসএফটি

1
+1 "আপনার যদি NoCacheController ক্লাসে ডিফল্টগুলি ওভাররাইড করার দরকার হয় তবে আপনার ক্রিয়া পদ্ধতিতে কেবল ক্যাশে সেটিংস নির্দিষ্ট করুন এবং আপনার অ্যাকশন পদ্ধতির সেটিংস অগ্রাধিকার নেবে" "
Korayem

2
দয়া করে নোট করুন যে আপনি যদি [System.Web.Mvc.OutputCache(NoStore = true, Duration = 0, VaryByParam = "*")]ক্লাস স্তরে ব্যবহার করেন তবে আপনার ক্লাসে আংশিক দৃশ্য থাকতে পারে না।
ভিভিয়ান নদী

1
দুটি শর্ত উপস্থিত থাকলে আউটপুটক্যাচ পদ্ধতি আইআই ক্যাচিং আটকাতে পারেনি: 1) ক্রিয়াকলাপটি কোনও পরামিতি নেয়নি এবং 2) ক্রিয়াকলাপটি কেবলমাত্র কিছু পাঠ্য (সামিটেক্সট) এর মাধ্যমে ফিরে আসে। আমি যখন জেএসএন ফিরে আসি এবং একটি প্যারামিটার নিই, আইই ক্যাশিং সঠিকভাবে পরাজিত।
ক্যাসি স্পিকম্যান

10

আপনি কন্ট্রোলার (যেমন এইচটিএমএল পৃষ্ঠাগুলি) দ্বারা রেন্ডার করা সমস্ত পৃষ্ঠাগুলির জন্য ব্রাউজারের ক্যাচিং অক্ষম করতে চাইতে পারেন, তবে স্ক্রিপ্টস, স্টাইল শীট এবং চিত্রগুলির মতো সংস্থার জন্য ক্যাশে রাখবেন । আপনি যদি এমভিসি 4 + বান্ডিলিং এবং মিনিফিকেশন ব্যবহার করে থাকেন তবে আপনি স্ক্রিপ্ট এবং স্টাইলশিটের জন্য ডিফল্ট ক্যাশে সময়কাল (খুব দীর্ঘ সময়সীমা, যেহেতু সময় অনুসারে নয়, অনন্য ইউআরএল পরিবর্তনের ভিত্তিতে ক্যাশে অবৈধ হয়ে যায়) রাখতে চান keep

এমভিসি 4 + তে, সমস্ত নিয়ামক জুড়ে ব্রাউজারের ক্যাচিং অক্ষম করতে, তবে কোনও নিয়ামক দ্বারা সরবরাহ না করা কোনও কিছুর জন্য এটি ধরে রাখতে, এটিকে যুক্ত করুন FilterConfig.RegisterGlobalFilters:

filters.Add(new DisableCache());

DisableCacheনিম্নলিখিত হিসাবে সংজ্ঞা দিন :

class DisableCache : ActionFilterAttribute
{
    public override void OnResultExecuting(ResultExecutingContext filterContext)
    {
        filterContext.HttpContext.Response.Cache.SetCacheability(HttpCacheability.NoCache);
    }
}

দুর্ভাগ্যক্রমে এটি কাজ করে না বলে সাইন আউট করার পরে পিছনে বোতামটি চাপলে পৃষ্ঠাটি প্রদর্শিত হয়।
5 ʙᴀᴋᴇʀ

6

আমি জানি এই উত্তরটি প্রশ্নের সাথে 100% সম্পর্কিত নয় তবে এটি কারওর পক্ষে সহায়তা করতে পারে।

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

এখানে ক্রোমের একটি স্ক্রিনশট রয়েছে


এটি ঠিক আমি সন্ধান করছিলাম ... দেবের সময়, আমি যদি একটি জেএসএস ফাইল পরিবর্তন করি তবে যখন আমি সামান্য সমস্যা সমাধান / রিফ্রেশ / পরীক্ষার চক্র করতে সমস্যা হয় তখনই তা ঘটানো বড় যন্ত্রণা। এটি নিখুঁত, আপনাকে ধন্যবাদ! আমার ক্লায়েন্ট সাইড ডিবাগিং
জীবনটিকে

2

আমি পূর্ববর্তী সমস্ত উত্তরগুলি বাস্তবায়িত করেছি এবং এখনও একটি দৃষ্টিভঙ্গি ছিল যা সঠিকভাবে কাজ করে না।

আমার যে ভিউটিতে সমস্যা হচ্ছে তার নামটির নাম রাখলাম 'সাম্প্রতিক'। স্পষ্টতই এই ইন্টারনেট এক্সপ্লোরার ব্রাউজারটি বিভ্রান্ত।

আমি ভিউয়ের নামটি (নিয়ামকটিতে) একটি আলাদা নামে (আমি 'সাম্প্রতিক 5' হিসাবে বেছে নিয়েছি) পরিবর্তন করার পরে, উপরের সমাধানগুলি কাজ শুরু করে।


0

আপনি Global.asax ফাইলে কোডের নীচে চেষ্টা করতে পারেন।

protected void Application_BeginRequest()
    {
        Response.Cache.SetCacheability(HttpCacheability.NoCache);
        Response.Cache.SetExpires(DateTime.UtcNow.AddHours(-1));
        Response.Cache.SetNoStore();
    }

-1

UI 'তে

<%@ OutPutCache Location="None"%>
<%
    Response.Buffer = true;
    Response.Expires = -1;
    Response.ExpiresAbsolute = System.DateTime.Now.AddSeconds(-1);
    Response.CacheControl = "no-cache";
%>

পটভূমি

Context.Response.Cache.SetCacheability(HttpCacheability.NoCache); 
Response.Expires = -1;          
Response.Cache.SetNoStore();

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