কোনও অ্যাট্রিবিউট ব্যবহার করে নির্দিষ্ট ক্রিয়াকলাপের জন্য এএসপি.নেট এমভিসি তে ক্যাচিং প্রতিরোধ করুন Pre


196

আমার একটি এএসপি.এনইটি এমভিসি 3 অ্যাপ্লিকেশন রয়েছে। এই অ্যাপ্লিকেশন jQuery মাধ্যমে রেকর্ড অনুরোধ। jQuery একটি নিয়ামক পদক্ষেপে ফিরে কল করে যা JSON ফর্ম্যাটে ফলাফল দেয়। আমি এটি প্রমাণ করতে সক্ষম হয়েছি না, তবে আমি উদ্বিগ্ন যে আমার ডেটাটি ক্যাশে হতে পারে।

আমি চাই কেবলমাত্র সমস্ত ক্রিয়নের জন্য নয়, নির্দিষ্ট ক্রিয়ায় ক্যাশে প্রয়োগ করা উচিত।

ডেটাটি ক্যাশে না হয়ে যায় তা নিশ্চিত করার জন্য আমি এমন কোনও বৈশিষ্ট্য রেখেছি যাতে আমি কোনও পদক্ষেপ নিতে পারি? যদি তা না হয় তবে আমি কীভাবে নিশ্চিত করব যে ব্রাউজারটি প্রতিবার ক্যাশেড সেটের পরিবর্তে রেকর্ডের একটি নতুন সেট পায়?


1
যদি আপনি অনুমান করছেন যে কোনও কিছু ক্যাশে করা হচ্ছে, তবে আমি আপনাকে এখানে ক্যাশে নিয়ন্ত্রণ ব্যবস্থাটি পড়ার পরামর্শ দিচ্ছি: w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.9

উত্তর:


304

আপনার এজ্যাক্স পদ্ধতিতে জিকুয়েরি ফলাফলগুলি ক্যাশে করছে না তা নিশ্চিত করতে নিম্নলিখিতটি লিখুন:

$.ajax({
    cache: false
    //rest of your ajax setup
});

বা এমভিসিতে ক্যাচিং প্রতিরোধ করতে আমরা আমাদের নিজস্ব বৈশিষ্ট্য তৈরি করেছি, আপনিও এটি করতে পারেন। আমাদের কোড এখানে:

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method)]
public sealed 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]। বা সবার জন্য এটি করার জন্য আপনি কেবল বেস ক্লাসের শ্রেণিতে এই বৈশিষ্ট্যটি রেখে দিতে পারেন যে আপনি এখানে যেমন আমাদের নিয়ন্ত্রণকারীর (আপনার যদি থাকে) থেকে উত্তরাধিকারী হন:

[NoCache]
public class ControllerBase : Controller, IControllerBase

আপনি যদি পুরো কন্ট্রোলারটিকে সজ্জিত না করে ক্যাশেড করতে সক্ষম না হন তবে এই বৈশিষ্ট্যটি সহ কয়েকটি ক্রিয়াও সাজাতে পারেন।

আপনার শ্রেণিতে বা ক্রিয়াকলাপটি NoCacheযদি এটি আপনার ব্রাউজারে রেন্ডার করা হয়নি এবং আপনি এটি কাজ করছে তা পরীক্ষা করতে চান, তবে মনে রাখবেন যে পরিবর্তনগুলি সংকলনের পরে আপনার ব্রাউজারে একটি "হার্ড রিফ্রেশ" (Ctrl + F5) করা দরকার do আপনি এটি না করা পর্যন্ত আপনার ব্রাউজারটি পুরানো ক্যাশেড সংস্করণ রাখবে এবং এটিকে একটি "সাধারণ রিফ্রেশ" (এফ 5) দিয়ে রিফ্রেশ করবে না।


1
আমি উপরের সমাধানটিতে সবকিছু চেষ্টা করেছি এবং এটি আমার পক্ষে কার্যকর হয় না।
ওবি ওয়ান

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

2
অ্যাকশন লেভেলে নয়, শুধুমাত্র কন্ট্রোলার স্তরে কাজ করেছেন।
রমেশ

3
আমি অফিসিয়াল
এএসপি.নেট

1
@ ফ্রেডেরিক, আপনি যে অনুমানের নির্দেশ করেছেন সে বিভাগটি বলছে যে ক্যাচগুলি নন-স্টোর সামগ্রীকে ক্যাশে করতে পারে না: "নো-স্টোর" প্রতিক্রিয়া নির্দেশিকাটি নির্দেশ করে যে কোনও ক্যাশে তাত্ক্ষণিক অনুরোধ বা প্রতিক্রিয়াটির কোনও অংশ সংরক্ষণ করতে হবে না।
ক্রিশ্চিয়ানপ

258

ক্যাচিং প্রতিরোধ করতে আপনি বিল্ট ইন ক্যাশে অ্যাট্রিবিউট ব্যবহার করতে পারেন।

। নেট ফ্রেমওয়ার্কের জন্য: [OutputCache(NoStore = true, Duration = 0)]

নেট কোরের জন্য: [ResponseCache(NoStore = true, Duration = 0)]

সচেতন থাকুন যে ব্রাউজারটিকে ক্যাচিং অক্ষম করতে বাধ্য করা অসম্ভব। আপনি যা করতে পারেন তা হ'ল সাধারণত যে শিরোনাম বা মেটা ট্যাগ আকারে বেশিরভাগ ব্রাউজার সম্মান জানায় provide এই প্রসাধক অ্যাট্রিবিউট সার্ভার ক্যাশে অক্ষম করবে এবং এই শিরোনাম যোগ করুন: Cache-Control: public, no-store, max-age=0। এটি মেটা ট্যাগ যুক্ত করে না। যদি ইচ্ছা হয় তবে সেগুলিতে দর্শনটিতে ম্যানুয়ালি যোগ করা যেতে পারে।

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

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


3
আমি বিশ্বাস করি এটি পুরোপুরি প্রশ্নের সমাধান করে না। এটি এএসপি.এনইটি ক্যাচিং অক্ষম করে তবে ব্রাউজার ক্যাশে করে না।
রোসদি কাসিম

22
ব্রাউজারটিকে ক্যাচিং অক্ষম করতে বাধ্য করা অসম্ভব। আপনি যা করতে পারেন তা হ'ল সাধারণত যে শিরোনাম বা মেটা ট্যাগ আকারে বেশিরভাগ ব্রাউজার সম্মান জানায় provide এই ডেকোরেটর বৈশিষ্ট্যটি .NET সার্ভারের ক্যাচিং অক্ষম করবে এবং শিরোনামও যুক্ত করবে Cache-Control:public, no-store, max-age=0। এটি মেটা ট্যাগ যুক্ত করে না। যদি ইচ্ছা হয় তবে সেগুলিতে দর্শনটিতে ম্যানুয়ালি যোগ করা যেতে পারে।
জাগুইর

1
আমি বুঝতে পারি আপনি কেন ব্যবহার করবেন NoStore = trueএবং Duration = 0(যা আমি সফলভাবে ব্যবহার করেছি, ধন্যবাদ), তবে VaryByParam = "None"পরামিতি নির্বিশেষে অন্য দুটি বিকল্প সমস্ত অনুরোধকে প্রভাবিত করবে বলে অতিরিক্ত প্রভাব কী হবে ?
কোডিংটি

আমার মনে হয় না এটি এমভিসিতে দরকার, আমি কেবল স্পষ্ট করে বলছিলাম। আমার মনে আছে যে এএসপি.এনইটি ওয়েব ফর্ম এবং ব্যবহারকারীর নিয়ন্ত্রণগুলিতে এই বৈশিষ্ট্যটি বা ভ্যারিবাইকন্ট্রোল বৈশিষ্ট্যটি প্রয়োজনীয়।
জাগুইর

1
এএসপি.নেট কোর ব্যবহারের জন্য: '[রেসপন্সসিচি (NoStore = সত্য, সময়কাল = 0)]'
জেফ

48

তোমার যা দরকার তা হল:

[OutputCache(Duration=0)]
public JsonResult MyAction(

বা, আপনি যদি এটি পুরো নিয়ন্ত্রকের জন্য অক্ষম করতে চান:

[OutputCache(Duration=0)]
public class MyController

এখানে মন্তব্যে বিতর্ক থাকা সত্ত্বেও, এটি ব্রাউজার ক্যাচিং অক্ষম করার পক্ষে যথেষ্ট - এর ফলে ASP.Net প্রতিক্রিয়া শিরোনামগুলি নির্গত করতে পারে যা ব্রাউজারকে বলে যে দস্তাবেজটির অবিলম্বে মেয়াদ শেষ হয়ে গেছে:

আউটপুট ক্যাশে সময়কাল = 0 প্রতিক্রিয়া শিরোনাম: সর্বাধিক বয়স = 0, এস-সর্বোচ্চ = 0


6
আইই 8 তখনও পৃষ্ঠার ক্যাশেড সংস্করণটিকে রেন্ডার করে যখন একটি নিয়ন্ত্রণকারী ক্রিয়ায় কেবলমাত্র সময়কাল = 0 ব্যবহার করে পিছনের বোতামটি ক্লিক করা হয়। NoStore ব্যবহার করে = সময়কাল = 0 সহ সঠিক (জ্যারেডের উত্তর দেখুন) আমার ক্ষেত্রে আচরণটি স্থির করে।
কিথ কেটেরের

3
এই সেটিংটি এর কিছুটা জানতে আগ্রহী আচরণ করল Cache-Controlকরতেpublic
ta.speot.is

max-age=0কখনও 'ক্যাশে অক্ষম' বোঝায় নি। এর অর্থ কেবল এই নয় যে প্রতিক্রিয়া সামগ্রীটি অবিলম্বে বাসি বিবেচনা করা উচিত , তবে একটি ক্যাশে এটি ক্যাশে করার অনুমতি দেয়। ব্রাউজারগুলি ক্যাশেড বাসি সামগ্রী ব্যবহার করার আগে তাজাতা যাচাই করা উচিত, তবে অতিরিক্ত নির্দেশ নির্দেশ না করা পর্যন্ত এটি বাধ্যতামূলক নয় must-revalidate
ফ্রাডেরিক

14

নিয়ামক পদক্ষেপে নিম্নলিখিত লাইনগুলিতে শিরোনামে সংযোজন

    public ActionResult Create(string PositionID)
    {
        Response.AppendHeader("Cache-Control", "no-cache, no-store, must-revalidate"); // HTTP 1.1.
        Response.AppendHeader("Pragma", "no-cache"); // HTTP 1.0.
        Response.AppendHeader("Expires", "0"); // Proxies.

5

NoCacheক্রিস মোশচিনির উত্তর থেকে তথ্যগুলি ব্যবহার করে সরল করে ম্যাটটিটোমো দ্বারা প্রস্তাবিত বৈশিষ্ট্যটি এখানে :

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method)]
public sealed class NoCacheAttribute : OutputCacheAttribute
{
    public NoCacheAttribute()
    {
        this.Duration = 0;
    }
}

কোনও কারণে এমভিসি 3 কেবলমাত্র আপনাকে সময়কাল 0 এ সেট করতে দেয় না আপনাকে এই টিকাগুলি যোগ করতে হবে ... কার্যক্রমের জন্য ধন্যবাদ!
মিকাহুভার

max-age=0কখনও 'ক্যাশে অক্ষম' বোঝায় নি। এর অর্থ কেবল এই নয় যে প্রতিক্রিয়া সামগ্রীটি অবিলম্বে বাসি বিবেচনা করা উচিত , তবে একটি ক্যাশে এটি ক্যাশে করার অনুমতি দেয়। ব্রাউজারগুলি ক্যাশেড বাসি সামগ্রী ব্যবহার করার আগে তাজাতা যাচাই করা উচিত, তবে অতিরিক্ত নির্দেশ নির্দেশ না করা পর্যন্ত এটি বাধ্যতামূলক নয় must-revalidate
ফ্রেডেরিক

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

4

এমভিসি 6 ( ডিএনএক্স ) এর জন্য, নেইSystem.Web.OutputCacheAttribute

দ্রষ্টব্য: আপনি যখন NoStoreসময়কাল পরামিতি সেট করেন তখন বিবেচনা করা হয় না। প্রথম নিবন্ধকরণের জন্য প্রাথমিক সময় নির্ধারণ করা এবং কাস্টম বৈশিষ্ট্যের সাথে এটি ওভাররাইড করা সম্ভব।

কিন্তু আমাদের আছে Microsoft.AspNet.Mvc.Filters.ResponseCacheFilter

 public void ConfigureServices(IServiceCollection services)
        ...
        services.AddMvc(config=>
        {
            config.Filters.Add(
                 new ResponseCacheFilter(
                    new CacheProfile() { 
                      NoStore=true
                     }));
        }
        ...
       )

কাস্টম বৈশিষ্ট্যের সাহায্যে প্রাথমিক ফিল্টারটি ওভাররাইড করা সম্ভব

    [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method)]
    public sealed class NoCacheAttribute : ActionFilterAttribute
    {
        public override void OnResultExecuting(ResultExecutingContext filterContext)
        {
            var filter=filterContext.Filters.Where(t => t.GetType() == typeof(ResponseCacheFilter)).FirstOrDefault();
            if (filter != null)
            {
                ResponseCacheFilter f = (ResponseCacheFilter)filter;
                f.NoStore = true;
                //f.Duration = 0;
            }

            base.OnResultExecuting(filterContext);
        }
    }

এখানে একটি ব্যবহারের কেস দেওয়া আছে

    [NoCache]
    [HttpGet]
    public JsonResult Get()
    {            
        return Json(new DateTime());
    }

1

এমভিসিতে আউটপুট ক্যাচিং

[আউটপুট ক্যাশে (NoStore = সত্য, সময়কাল = 0, অবস্থান = "কিছুই নয়", ভ্যারিবিপরাম = "*")]

অথবা
[আউটপুট ক্যাশে (NoStore = সত্য, সময়কাল = 0, VaryByParam = "কিছুই নয়")]


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

1

ব্রাউজারের ক্যাচিং ( ইন্টারনেট এক্সপ্লোরার 11 সহ ) প্রতিরোধের জন্য Asp.Net MVC কোর এর সঠিক বৈশিষ্ট্য মানটি হ'ল:

[ResponseCache(Location = ResponseCacheLocation.None, NoStore = true)]

মাইক্রোসফ্ট ডকুমেন্টেশনে বর্ণিত হিসাবে:

ASP.NET কোর - NoStore এবং অবস্থান.None মধ্যে প্রতিক্রিয়া ক্যাশে


0

এএসপি.নেট এমভিসি 5 টি সমাধান:

  1. কেন্দ্রীয় অবস্থানে ক্যাচিং প্রতিরোধের কোড: App_Start/FilterConfig.csএর RegisterGlobalFiltersপদ্ধতি:
    public class FilterConfig
    {
        public static void RegisterGlobalFilters(GlobalFilterCollection filters)
        {
            // ...
            filters.Add(new OutputCacheAttribute
            {
                NoStore = true,
                Duration = 0,
                VaryByParam = "*",
                Location = System.Web.UI.OutputCacheLocation.None
            });
        }
    }
  1. একবার আপনার এই স্থানে চলে আসার পরে আমার বোধগম্যতা হ'ল আপনি বৈশ্বিক ফিল্টারকে ওভাররাইড করতে পারেন কোনও ভিন্ন OutputCacheনির্দেশনা Controllerবা Viewস্তরে প্রয়োগ করে । নিয়মিত নিয়ামকের জন্য এটি
[OutputCache(NoStore = true, Duration = 0, Location=System.Web.UI.ResponseCacheLocation.None, VaryByParam = "*")]

বা যদি এটি একটি এর ApiControllerএটা হতে চাই

[System.Web.Mvc.OutputCache(NoStore = true, Duration = 0, Location = System.Web.UI.OutputCacheLocation.None, VaryByParam = "*")]
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.