전체 ASP.NET MVC 웹 사이트에 대해 브라우저 캐시를 비활성화하는 방법을 찾고 있습니다
다음과 같은 방법을 찾았습니다.
Response.Cache.SetCacheability(System.Web.HttpCacheability.NoCache);
Response.Cache.SetNoStore();
또한 메타 태그 방법 (일부 MVC 작업은 머리, 메타 태그없이 Ajax를 통해 부분 HTML / JSON을 전송하기 때문에 작동하지 않습니다).
<meta http-equiv="PRAGMA" content="NO-CACHE">
그러나 전체 웹 사이트에서 브라우저 캐시를 비활성화하는 간단한 방법을 찾고 있습니다.
답변
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를 통해 먼저 라우팅되므로 코드를 뒤에 넣을 수 있다고 가정합니다.
답변
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();
}
}
답변
자신을 굴리는 대신 제공된 것을 사용하십시오.
앞에서 언급했듯이 모든 캐싱을 비활성화하지 마십시오. 예를 들어 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()
{
...
}
답변
컨트롤러에서 렌더링 한 모든 페이지 (예 : 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);
}
}
답변
이 답변이 질문과 100 % 관련이 없지만 누군가에게 도움이 될 수 있음을 알고 있습니다.
전체 ASP.NET MVC 웹 사이트에 대해 브라우저 캐시를 사용하지 않으려 고 하지만 임시로만 수행하려는 경우 브라우저에서 캐시를 사용하지 않는 것이 좋습니다.
답변
이전의 모든 답변을 구현했지만 여전히 제대로 작동하지 않는 하나의 견해를 가지고있었습니다.
문제가 발생한보기의 이름이 ‘최근’이라고 밝혀졌습니다. 분명히 이것은 Internet Explorer 브라우저와 혼동되었습니다.
컨트롤러에서보기 이름을 다른 이름으로 변경 한 후 ( ‘Recent5’를 선택) 위의 솔루션이 작동하기 시작했습니다.
답변
Global.asax 파일에서 아래 코드를 시도 할 수 있습니다.
protected void Application_BeginRequest()
{
Response.Cache.SetCacheability(HttpCacheability.NoCache);
Response.Cache.SetExpires(DateTime.UtcNow.AddHours(-1));
Response.Cache.SetNoStore();
}