문제

내 블로그의 경우 출력 캐시를 사용하여 특정 게시물의 캐시된 버전을 약 10분 동안 저장하려고 합니다. 괜찮습니다...

<%@OutputCache Duration="600" VaryByParam="*" %>

그런데 누군가 댓글을 달면 캐시를 지워서 페이지를 새로고침해서 댓글을 볼 수 있도록 하고 싶습니다.

ASP.Net C#에서 이 작업을 어떻게 수행합니까?

도움이 되었습니까?

해결책

내가 찾던 답을 찾았습니다:

HttpResponse.RemoveOutputCacheItem("/caching/CacheForever.aspx");

다른 팁

캐시를 지우려는 페이지를 알고 있다면 위의 내용은 괜찮습니다.제 경우(ASP.NET MVC)에서는 전체에서 동일한 데이터를 참조했습니다.그래서 [저장]을 할 때 사이트 전체의 캐시를 지우고 싶었습니다.이것이 나를 위해 일한 것입니다. http://aspalliance.com/668

이는 OnActionExecuting 필터의 컨텍스트에서 수행됩니다.BaseController 등에서 OnActionExecuting을 재정의하면 쉽게 수행할 수 있습니다.

HttpContextBase httpContext = filterContext.HttpContext;
httpContext.Response.AddCacheItemDependency("Pages");

설정:

protected void Application_Start()
{
    HttpRuntime.Cache.Insert("Pages", DateTime.Now);
}

사소한 조정:"플래시 메시지"(오류 메시지, 성공 메시지 - "이 항목이 성공적으로 저장되었습니다" 등)를 추가하는 도우미가 있습니다.이후의 모든 GET에서 플래시 메시지가 표시되는 것을 방지하기 위해 플래시 메시지를 작성한 후 무효화해야 했습니다.

캐시 지우기:

HttpRuntime.Cache.Insert("Pages", DateTime.Now);

도움이 되었기를 바랍니다.

Response.AddCacheItemDependency를 사용하여 모든 출력 캐시를 지웁니다.

  public class Page : System.Web.UI.Page
  {
    protected override void OnLoad(EventArgs e)
    {
        try
        {
            string cacheKey = "cacheKey";
            object cache = HttpContext.Current.Cache[cacheKey];
            if (cache == null)
            {
              HttpContext.Current.Cache[cacheKey] = DateTime.UtcNow.ToString();
            }

            Response.AddCacheItemDependency(cacheKey);
        }
        catch (Exception ex)
        {
            throw new SystemException(ex.Message);
        }

        base.OnLoad(e);
    }     
 }



  // Clear All OutPutCache Method    

    public void ClearAllOutPutCache()
    {
        string cacheKey = "cacheKey";
        HttpContext.Cache.Remove(cacheKey);
    }

이는 ASP.NET MVC의 OutputCachedPage에서도 사용할 수 있습니다.

마스터 페이지 로드 이벤트에 다음을 작성하세요.

Response.Cache.SetExpires(DateTime.UtcNow.AddMinutes(-1));
Response.Cache.SetCacheability(HttpCacheability.NoCache);
Response.Cache.SetNoStore();

로그아웃 버튼에서 다음을 클릭하세요.

Session.Abandon();
Session.Clear();

흠.OutputCache 항목에 VaryByCustom 속성을 지정할 수 있습니다.이 값은 global.asax에서 구현할 수 있는 GetVaryByCustomString 메서드에 매개 변수로 전달됩니다.이 메소드에서 반환된 값은 캐시된 항목에 대한 인덱스로 사용됩니다. 예를 들어 페이지의 댓글 수를 반환하면 댓글이 추가될 때마다 새 페이지가 캐시됩니다.

주의할 점은 이것이 실제로 캐시를 지우지는 않는다는 것입니다.블로그 항목에 댓글 사용량이 많으면 이 방법을 사용하면 캐시 크기가 폭발적으로 증가할 수 있습니다.

또는 페이지의 변경 불가능한 부분(탐색, 광고, 실제 블로그 항목)을 사용자 컨트롤로 구현하고 각 사용자 컨트롤에 부분 페이지 캐싱을 구현할 수 있습니다.

"*"를 캐시가 연결되어야 하는 매개변수(PostID?)로 변경하면 다음과 같이 할 수 있습니다.

//add dependency
string key = "post.aspx?id=" + PostID.ToString();
Cache[key] = new object();
Response.AddCacheItemDependency(key);

누군가 댓글을 추가하면...

Cache.Remove(key);

모든 요청이 동일한 캐시 종속성에 연결되므로 VaryByParam *에서도 작동할 것 같습니다.

왜 post 테이블에 sqlcachedependent를 사용하지 않습니까?

sqlcache종속성 msdn

이렇게 하면 사용자 정의 캐시 지우기 코드를 구현하지 않고 DB의 콘텐츠가 변경될 때 캐시를 새로 고치나요?

HttpRuntime.Close() ..나는 모든 방법을 시도했지만 이것이 나에게 효과가 있는 유일한 방법입니다

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top