programing

ASP에서 캐싱을 금지합니다.속성을 사용하는 특정 작업에 대한 NET MVC

abcjava 2023. 7. 30. 16:45
반응형

ASP에서 캐싱을 금지합니다.속성을 사용하는 특정 작업에 대한 NET MVC

ASP를 가지고 있습니다.NET MVC 3 응용 프로그램.이 응용 프로그램은 jQuery.jQuery를 통해 레코드를 요청합니다. jSON 형식으로 결과를 반환하는 컨트롤러 작업으로 다시 호출합니다.이를 증명할 수는 없지만 데이터가 캐시에 저장되는 것이 걱정됩니다.

모든 작업이 아닌 특정 작업에만 캐싱을 적용합니다.

데이터가 캐시되지 않도록 작업에 추가할 수 있는 특성이 있습니까?그렇지 않은 경우 브라우저가 캐시된 레코드 집합 대신 매번 새 레코드 집합을 가져오도록 하려면 어떻게 해야 합니까?

JQuery가 결과를 캐싱하지 않도록 하려면 Ajax 메서드에 다음을 입력합니다.

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

또는 MVC에서 캐싱을 방지하기 위해 자체 속성을 만들었습니다. 여러분도 그렇게 할 수 있습니다.코드는 다음과 같습니다.

[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)을 수행해야 합니다.이렇게 할 때까지 브라우저는 이전 캐시 버전을 유지하고 "일반 새로 고침"(F5)으로 새로 고치지 않습니다.

기본 제공 캐시 특성을 사용하여 캐시를 방지할 수 있습니다.

.net Framework의 경우:[OutputCache(NoStore = true, Duration = 0)]

.net Core의 경우:[ResponseCache(NoStore = true, Duration = 0)]

브라우저에서 캐시를 강제로 비활성화할 수 없습니다.대부분의 브라우저가 일반적으로 헤더 또는 메타 태그 형태로 제공하는 제안을 제공하는 것이 가장 좋습니다.이 장식자 특성은 서버 캐싱을 사용 불가능으로 설정하고 다음 헤더도 추가합니다.Cache-Control: public, no-store, max-age=0메타 태그를 추가하지 않습니다.원하는 경우 보기에서 수동으로 추가할 수 있습니다.

또한 JQuery 및 기타 클라이언트 프레임워크는 타임스탬프 또는 GUID와 같은 항목을 URL에 추가하여 브라우저가 캐시된 리소스 버전을 사용하지 않도록 속이려고 시도합니다.이렇게 하면 브라우저가 리소스를 다시 요청하는 데 효과적이지만 캐싱을 방해하지는 않습니다.

마지막으로.서버와 클라이언트 사이에 리소스를 캐시할 수도 있습니다.ISP, 프록시 및 기타 네트워크 장치도 리소스를 캐시하며 실제 리소스를 보지 않고 내부 규칙을 사용하는 경우가 많습니다.이것들에 대해 당신이 할 수 있는 것은 많지 않습니다.좋은 소식은 일반적으로 몇 초 또는 몇 분과 같은 짧은 시간 동안 캐시한다는 것입니다.

필요한 것은 다음과 같습니다.

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

또는 전체 컨트롤러에 대해 비활성화하려는 경우:

[OutputCache(Duration=0)]
public class MyController

여기서 설명에 대한 논쟁에도 불구하고, 이것은 브라우저 캐싱을 비활성화하기에 충분합니다. 이것은 ASP를 유발합니다.Net: 문서가 즉시 만료됨을 브라우저에 알리는 응답 헤더를 발송합니다.

OutputCache Duration=0 Response Headers: max-age=0, s-maxage=0

컨트롤러 작업에서 헤더에 다음 행을 추가합니다.

    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.

여기 있습니다.NoCache은 Chris 되었습니다. mattytomo는 Chris Moschini의 속성입니다.

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

MVC6(DNX)의 경우, 다음과 같은 것이 없습니다.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());
    }

ASP.NET MVC 5 솔루션:

  1. 캐싱:App_Start/FilterConfig.csRegisterGlobalFilters방법:
    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. , 일단당그시게되하, 을▁filter▁by▁a▁global▁applying▁once▁the▁different▁override다▁can니이▁that▁in합해▁my▁place▁you▁you▁that▁under▁have일▁isstanding것을을 적용함으로써 글로벌 필터를 재정의할 수 있다고 생각합니다.OutputCache 지한시의 지시.Controller또는View벨레입니다. 일반 컨트롤러의 경우 다음과 같습니다.
[OutputCache(NoStore = true, Duration = 0, Location=System.Web.UI.ResponseCacheLocation.None, VaryByParam = "*")]

아면그이것니▁it이그.ApiController일 것입니다

[System.Web.Mvc.OutputCache(NoStore = true, Duration = 0, Location = System.Web.UI.OutputCacheLocation.None, VaryByParam = "*")]

Asp의 특성 값이 올바릅니다.브라우저 캐싱(Internet Explorer 11 포함)을 방지하기 위한 NetMVC Core는 다음과 같습니다.

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

마이크로소프트 설명서에 설명된 대로:

ASP의 응답 캐싱.NET Core - 스토어 및 위치 없음.없음

MVC의 출력 캐싱

[OutputCache(스토어 없음 = true, 기간 = 0, 위치 = "없음", VariByParam = "*")]
OR[OutputCache(스토어 없음 = true, 기간 = 0, VariByParam = "없음")]

언급URL : https://stackoverflow.com/questions/10011780/prevent-caching-in-asp-net-mvc-for-specific-actions-using-an-attribute

반응형