sourcetip

ASP.NET에서 모든 브라우저에 대해 브라우저 캐싱 사용 안 함

fileupload 2023. 7. 7. 21:01
반응형

ASP.NET에서 모든 브라우저에 대해 브라우저 캐싱 사용 안 함

브라우저가 페이지를 캐시하지 못하도록 하려면 어떤 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));
    }
}

ASP.NET에서는 다음과 같이 사용합니다.

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

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

파이어폭스와 IE에서 캐싱을 중지하지만 다른 브라우저는 시도하지 않았습니다.다음 응답 헤더는 다음 문에 의해 추가됩니다.

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

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

저는 파이어폭스에서 다양한 조합을 시도했지만 실패했습니다.시간이 많이 지났기 때문에 위의 답변이 정상적으로 작동하거나 제가 누락한 것이 있을 수 있습니다.

항상 제게 효과가 있었던 것은 각 페이지의 머리글이나 템플릿(.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>

이로 인해 모든 브라우저에서 모든 캐싱이 사용 불가능하게 되었습니다.

제가 알고 있는 접근법은 두 가지입니다.첫 번째는 브라우저에 페이지를 캐시하지 말라고 하는 것입니다.응답을 캐시 없음으로 설정하면 문제가 해결되지만 브라우저가 이 지시를 무시하는 경우가 많습니다.다른 방법은 응답 날짜 시간을 미래의 특정 시점으로 설정하는 것입니다.나는 모든 브라우저가 캐시에 페이지를 추가할 때 현재 시간으로 수정할 것이라고 생각하지만, 비교가 되면 페이지가 더 새로운 것으로 표시됩니다.비교가 안 되는 경우도 있을 수 있다고 생각합니다.자세한 내용은 잘 모르겠고 새 브라우저가 출시될 때마다 변경됩니다.마지막 노트 나는 스스로 "새로 고침"하는 페이지(다른 응답 지침)에서 더 좋은 운을 얻었습니다.새로 고침은 캐시에서 발생할 가능성이 적은 것 같습니다.

도움이 되길 바랍니다.

사이트에 no-store 태그를 추가하여 브라우저 캐싱에 차이가 있는지 테스트해 보겠습니다(Chrome은 때때로 페이지를 캐싱했습니다).또한 캐싱이 작동하는 방법과 이유에 대한 문서에서 이 기사가 매우 유용하다는 것을 알게 되었고, 스토어가 없는 경우 ETAG의 다음 기사를 살펴볼 것입니다.

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

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

참고 항목Google Chrome이 내 입력(특히 사용자가 뒤로 클릭할 때 숨겨진 입력)을 캐시하지 못하게 하는 방법은 무엇입니까?Chrome이 다시 로드할 수 있지만 이전 내용은 보존할 수 있습니다.<input>- 소요 - 다말해, 용사를 합니다.autocomplete="off".

언급URL : https://stackoverflow.com/questions/914027/disabling-browser-caching-for-all-browsers-from-asp-net

반응형