전체 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.