ASP.NET의 모든 브라우저에 대해 브라우저 캐싱 비활성화


87

나는 브라우저가 페이지를 캐싱하지 못하도록하는 데 필요한 ASP.NET 코드에 대한 명확한 참조를 찾고 있습니다. HTTP 헤더와 메타 태그에 영향을 미치는 방법은 여러 가지가 있으며, 다른 브라우저가 올바르게 작동하려면 다른 설정이 필요하다는 인상을 받았습니다. 모든 브라우저에서 작동하는 코드와 버전을 포함한 특정 브라우저에 필요한 코드를 주석으로 처리하는 것은 정말 좋을 것입니다.

이 문제에 대한 많은 정보가 있지만 각 방법의 이점과 특정 기술이 상위 수준의 API로 대체되었는지 여부를 설명하는 좋은 참조를 아직 찾지 못했습니다.

특히 ASP.NET 3.5 SP1에 관심이 있지만 이전 버전에 대한 답변을 얻는 것도 좋을 것입니다.

이 블로그 항목 에서는 Firefox와 IE 캐싱의 두 가지 중요한 차이점에 대해 몇 가지 HTTP 프로토콜 동작 차이점을 설명합니다.

다음 샘플 코드는 내가 관심있는 종류를 보여줍니다.

public abstract class NoCacheBasePage : System.Web.UI.Page
{
    protected override void OnInit(EventArgs e)
    {
        base.OnInit(e);

        DisableClientCaching();
    }

    private void DisableClientCaching()
    {
        // Do any of these result in META tags e.g. <META HTTP-EQUIV="Expire" CONTENT="-1">
        // HTTP Headers or both?

        // Does this only work for IE?
        Response.Cache.SetCacheability(HttpCacheability.NoCache);

        // Is this required for FireFox? Would be good to do this without magic strings.
        // Won't it overwrite the previous setting
        Response.Headers.Add("Cache-Control", "no-cache, no-store");

        // Why is it necessary to explicitly call SetExpires. Presume it is still better than calling
        // Response.Headers.Add( directly
        Response.Cache.SetExpires(DateTime.UtcNow.AddYears(-1));
    }
}

5
나는 당신의 임무가 얼마나 끔찍하게 불가능한지 모르겠다면 대답하려고 할 것입니다. 클라이언트의 캐시를 제어하는 ​​것은 가구를 재정렬하기 위해 10 피트 길이의 젓가락을 사용하는 것과 같습니다.
Jeff Meatball Yang

문제의 일부만을 다루는 많은 답변은 여전히 ​​매우 가치가있을 것입니다. 2 센트 가치를 던져주세요.
Martin Hollingsworth

답변:


97

이것이 우리가 ASP.NET에서 사용하는 것입니다.

// Stop Caching in IE
Response.Cache.SetCacheability(System.Web.HttpCacheability.NoCache);

// Stop Caching in Firefox
Response.Cache.SetNoStore();

Firefox 및 IE에서 캐싱을 중지하지만 다른 브라우저는 시도하지 않았습니다. 다음 응답 헤더는 이러한 명령문에 의해 추가됩니다.

Cache-Control: no-cache, no-store
Pragma: no-cache

5
+1 이것은 Chrome에서 저에게 효과적입니다. 감사합니다. 또한 Response.Cache.SetAllowResponseInBrowserHistory (true); 동일한 페이지의 각 요청에 대한 항목을 저장하는 기록을 방지합니다.
daniloquio

12
누군가 NoCache와 함께 SetCacheability를 사용하면 ASP.NET 출력 캐시 (서버 쪽 캐시)도 비활성화된다는 사실을 발견 한 것 같습니다. 대신 ServerAndNoCache 옵션을 사용하는 것이 좋습니다. codeclimber.net.nz/archive/2007/04/01/…
md1337

1
코드 스 니펫의 주석을 명확히하기 위해 주요 방법은 SetCacheability. SetNoStoreIE6 해결 방법입니다. HTTP 응답에 no-cache 및 no-store를 모두 사용해야하는 이유를 참조하십시오 . .
Edward Brey 2013 년

3
FWIW ... IE10 용 SetNoStore 추가 필요
felickz

https를 통해 동적 PDF를 출력하고 이와 같은 캐시 헤더를 설정하는이 페이지를 읽는 사람들을 위해 다음 IE8 및 하위 버그에주의하십시오. stackoverflow.com/questions/1038707/…
Paddy

41

그만한 가치가있는 것은 ASP.NET MVC 3 응용 프로그램에서이 작업을 처리해야했습니다. 다음은 모든 요청에 ​​대해이를 처리하기 위해 Global.asax 파일에서 사용한 코드 블록입니다.

    protected void Application_BeginRequest()
    {
        //NOTE: Stopping IE from being a caching whore
        HttpContext.Current.Response.Cache.SetAllowResponseInBrowserHistory(false);
        HttpContext.Current.Response.Cache.SetCacheability(HttpCacheability.NoCache);
        HttpContext.Current.Response.Cache.SetNoStore();
        Response.Cache.SetExpires(DateTime.Now);
        Response.Cache.SetValidUntilExpires(true);
    }

HttpContext.Current.Response.Cache.SetAllowResponseInBrowserHistory(false)IE와 파이어 폭스 bith에서 캐싱을 방지하기 위해 차이를 만들어
마이클 Kniskern

2
-1,이 Application_BeginRequest ()에서 설정하면 캐시 할 항목 (JavaScript 파일, 이미지 등)에 대해 캐시 없음 헤더가 전송됩니다. 아직 시도하지 않았지만 OP의 위치 (ASP 페이지 자체에 헤더 설정)가 더 좋을 것입니다.
Evan Haas 2013 년

glabal.asax에 설정하는 가장 좋은 방법이지만 아직 기쁨이 없기 때문에이 답변이 작동 할 것으로 예상했습니다.
lawphotog 2013-08-06

5
@Evan, Application_BeginRequest는 IIS에서 ASP.NET으로 전송 된 요청에 대해서만 호출됩니다. CSS, JS, 이미지, 글꼴 등과 같은 정적 파일은 IIS에서 정적 파일로 간주되고 ASP.NET 런타임으로 전송되지 않는 확장입니다. IIS가 모든 요청을 ASP.NET 런타임으로 보내도록 설정되어 있으면 예, 이는 파일이 정적이고 캐시되어야하는 경우에도 모든 요청에 ​​적용됩니다.
아담 카

@ 아담, 말이됩니다. 내 취소 할 -1하지만 SO는 내 투표가 :-(에 잠겨 말한다
에반 하스

2

다양한 조합을 시도했지만 FireFox에서 실패했습니다. 오랜 시간이 지났으므로 위의 답변이 잘 작동하거나 뭔가를 놓쳤을 수 있습니다.

나를 위해 항상 효과가 있었던 것은 각 페이지의 헤드 또는 템플릿 (.net의 마스터 페이지)에 다음을 추가하는 것입니다.

<script language="javascript" type="text/javascript">
    window.onbeforeunload = function () {   
        // This function does nothing.  It won't spawn a confirmation dialog   
        // But it will ensure that the page is not cached by the browser.
    }  
</script>

이것은 나를 위해 모든 브라우저에서 모든 캐싱을 실패없이 비활성화했습니다.


7
이것이 무엇을해야하는지는 확실하지 않지만, 이러한 브라우저의 다음 업데이트에서 실패 할 수밖에없는 큰 해킹처럼 보입니다.
md1337

예를 들어 web.archive.org/web/20160112095216/http://www.hunlock.com/blogs/…에 설명 되어 있습니다. 요약하면 onbeforeunload 이벤트는 은행에서 사용하도록 구현되었으며 페이지가 캐시되는 것을 방지합니다.
ChrisW 2011

1

내가 아는 두 가지 접근 방식이 있습니다. 첫 번째는 페이지를 캐시하지 않도록 브라우저에 지시하는 것입니다. 응답을 캐시 없음으로 설정하면 문제가 해결되지만 브라우저가이 지시문을 무시하는 경우가 많습니다. 다른 방법은 응답 날짜 시간을 미래 시점으로 설정하는 것입니다. 모든 브라우저가 페이지를 캐시에 추가 할 때 현재 시간으로 수정한다고 생각하지만 비교가 이루어지면 페이지가 더 최신으로 표시됩니다. 비교가 안되는 경우도있을 수 있다고 생각합니다. 자세한 내용은 확실하지 않으며 새 브라우저가 출시 될 때마다 변경됩니다. 마지막 메모 나는 스스로 "새로 고침"하는 페이지 (또 다른 응답 지시문)에서 더 나은 운을 보였습니다. 새로 고침이 캐시에서 발생할 가능성이 적습니다.

도움이되기를 바랍니다.


0

나는 이것이 브라우저 캐싱에 차이를 만드는지 확인하기 위해 우리 사이트에 no-store 태그를 추가하는 것을 테스트 할 것입니다 (Chrome은 때때로 페이지를 캐싱했습니다). 또한 캐싱이 작동하는 방법과 이유에 대한 문서에서이 기사가 매우 유용하다는 것을 발견했으며, 저장소가 신뢰할 수없는 경우 ETag의 다음 항목을 살펴볼 것입니다.

http://www.mnot.net/cache_docs/

http://en.wikipedia.org/wiki/HTTP_ETag


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.