전체 ASP.NET 웹 사이트에 대해 브라우저 캐시를 사용하지 않도록 설정


199

전체 ASP.NET MVC 웹 사이트에 대해 브라우저 캐시를 비활성화하는 방법을 찾고 있습니다

다음과 같은 방법을 찾았습니다.

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

또한 메타 태그 방법 (일부 MVC 작업은 머리, 메타 태그없이 Ajax를 통해 부분 HTML / JSON을 전송하기 때문에 작동하지 않습니다).

<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();

모든 요청은 default.aspx를 통해 먼저 라우팅되므로 코드를 뒤에 넣을 수 있다고 가정합니다.


17
Application_BeginRequest ()의 Global.asax.cs에 넣겠습니다. 나는이 default.aspx 일을 믿지 않는다 ... 다른 질문 : 이것이 [OutputCache] 속성보다 우선합니까?
— chris166

5
나는 그런 식으로 이런 것들을 넣는 Global Action Filter를 만드는 아이디어를 좋아합니다. Default.aspx 및 Global.asax에 대해 걱정할 필요가 없습니다.
— Keith Adler

13
이것을 Application_BeingRequest에 넣으면 몇 가지 문제가 발생할 수 있습니다. 이미지가 .net 런타임을 통해 라우팅되는 경우 (좋은 URL에 와일드 카드 매핑을 사용하는 경우 발생할 수 있음) 브라우저에 이미지가 캐시되지 않습니다. 이렇게하면 각 페이지 요청이 모든 이미지를 다시 다운로드하므로 페이지로드 시간이 느려질 수 있습니다.
— herbrandson

4
프로그래밍 방식으로 아무것도 사용하면 선언 된 모든 속성이 항상 재정의됩니다. 즉, OP의 코드를 사용하면 선언 된 [OutputCache] 특성이 재정의됩니다.
— Dave Black

흡연 테스트 방법과 캐시 비활성화가 실제로 작동하는지 확인하는 방법에 대한 생각이 있습니까?
— 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는 pre-MVC HttpContext 객체를 반환하고 filterContext.HttpContext는 MVC HttpContextBase를 반환하므로 HttpContext.Current.Response 대신 filterContext.HttpContext.Response를 사용해야합니다. 테스트 가능성과 일관성이 향상됩니다.
— mkedobbs

5
IActionFilter는 이미 ActionFilterAttribute에 구현되어 있으므로 반복 할 필요가 없습니다.
— Andrew Davey

104
[OutputCache를 (NoStore = 사실, 시간 = 0, VaryByParam 특성 = "없음")] : ASP.NET MVC의 최신 버전에서 당신은 단순히 캐싱을 방지하기 위해 OutputCacheAttribute을 사용할 수 있습니다
— 애슐리 테이트

9
이 질문에 대한 대답을 포함하여 ASP.NET MVC의 솔루션 아래에서 "캐싱을 중지하기 위해 코드에 넣습니다"솔루션을 사용하는 데 며칠을 보냈다는 것을 지적하고 싶습니다. 이 답변-속성-이 효과가있었습니다. 내가 할 수 있다면 + 1M 담당자 ...
— Tom Kidd

5
if (filterContext.IsChildAction) return;상단 에 추가하고 싶을 수도 있습니다. 이렇게하면 NoCache속성 으로 장식 된 하위 작업을 호출하는 경우 외부 작업이 '캐시되지'않습니다 . 다시 말해서 NoCache속성이 하위 작업을 실행하는 경우 다른 작업으로 누출되지 않습니다. 또한 클래스 이름은 NoCacheAttribute일반적으로 허용되는 속성 명명 규칙을 준수해야합니다.
— Jakub Konecki

132

자신을 굴리는 대신 제공된 것을 사용하십시오.

앞에서 언급했듯이 모든 캐싱을 비활성화하지 마십시오. 예를 들어 ASP.NET MVC에서 많이 사용되는 jQuery 스크립트는 캐시되어야합니다. 실제로 이상적으로는 CDN 을 사용해야 하지만 내 요점은 일부 내용을 캐시해야한다는 것입니다.

내가 찾은 것은 어디에서나 [OutputCache]를 뿌리지 않고 여기에서 가장 잘 작동합니다.

[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
@Ozziepeeps, 귀하의 의견이 정확하지 않습니다. msdn 문서는 브라우저 캐싱에 대해 설명하고 간단한 테스트를 통해이 속성이 캐시 제어 응답 헤더를 "Cache-Control : private"에서 "Cache-Control : private"에서 "Cache-Control : public, no-store, max-age = 0"으로 변경 함을 보여줍니다. 속성을 사용하여.
— Adam Tuliper-MSFT

2
또한 fyi-이 속성을 사용하여 세 위치 (서버, 프록시, 클라이언트)를 모두 제어 할 수 있으므로 서버 캐시 이상으로 제어 할 수 있습니다. 자세한 내용은 asp.net/mvc/tutorials/… 를 참조 하십시오.
— Adam Tuliper-MSFT

1
+1 "NoCacheController 클래스에서 기본값을 재정의해야하는 경우 단순히 액션 메소드에서 캐시 설정을 지정하면 액션 메소드의 설정이 우선합니다."
— Korayem

2
[System.Web.Mvc.OutputCache(NoStore = true, Duration = 0, VaryByParam = "*")]클래스 수준에서 사용하는 경우 클래스에 PartialView를 사용할 수 없습니다.
— Vivian River

1
OutputCache 메소드는 두 가지 조건이 존재할 때 IE 캐싱을 막지 못했습니다. JSON을 반환하고 매개 변수를 사용하면 IE 캐싱이 올바르게 해제됩니다.
— Kasey Speakman 2016 년

10

컨트롤러에서 렌더링 한 모든 페이지 (예 : HTML 페이지)에 대해 브라우저 캐싱을 비활성화 하고 스크립트, 스타일 시트 및 이미지와 같은 리소스에 대해서는 캐싱을 유지 하십시오 . MVC4 + 번들링 및 축소를 사용하는 경우 스크립트 및 스타일 시트의 기본 캐시 지속 시간을 유지하려고합니다 (시간이 아닌 고유 URL 변경에 따라 캐시가 무효화되므로 매우 긴 지속 시간).

MVC4 +에서 모든 컨트롤러에서 브라우저 캐싱을 비활성화하고 컨트롤러에서 제공하지 않는 항목에 대해서는 브라우저 캐싱을 유지하려면 FilterConfig.RegisterGlobalFilters다음을 추가하십시오 .

filters.Add(new DisableCache());

DisableCache다음과 같이 정의하십시오 .

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

유감스럽게도 로그 아웃 한 후 뒤로 단추를 누르면 페이지가 표시되므로 작동하지 않는 것 같습니다.
— ᴍᴀᴛᴛ ʙᴀᴋᴇʀ

6

이 답변이 질문과 100 % 관련이 없지만 누군가에게 도움이 될 수 있음을 알고 있습니다.

전체 ASP.NET MVC 웹 사이트에 대해 브라우저 캐시를 사용하지 않으려 고 하지만 임시로만 수행하려는 경우 브라우저에서 캐시를 사용하지 않는 것이 좋습니다.

다음은 Chrome의 스크린 샷입니다.


이것은 내가 찾던 것입니다 ... 개발 중에 .js 파일을 변경하면 거의 문제 해결 / 새로 고침 / 테스트주기를 수행하는 데 어려움이있을 때 즉시 처리 해야하는 것은 큰 고통입니다. 이것은 완벽합니다, 감사합니다! 내 클라이언트 쪽 디버깅 수명을 훨씬 쉽게 만들었습니다.
— jleach

2

이전의 모든 답변을 구현했지만 여전히 제대로 작동하지 않는 하나의 견해를 가지고있었습니다.

문제가 발생한보기의 이름이 '최근'이라고 밝혀졌습니다. 분명히 이것은 Internet Explorer 브라우저와 혼동되었습니다.

컨트롤러에서보기 이름을 다른 이름으로 변경 한 후 ( 'Recent5'를 선택) 위의 솔루션이 작동하기 시작했습니다.


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.