2010-08-13 3 views
4

HttpResponse.RemoveOutputCacheItem() 호출에서 제공되는 입도에 대해 다소 혼란 스럽습니다. 동적으로 생성 된 이미지에서 일부 출력 캐싱을 수행하는 데 관심이 있으며 적어도 매개 변수를 사용하여 출력 캐시를 변경하고 싶습니다. (매개 변수를 'id'및 'size'라고 가정 해 봅시다.)다양한 수준의 세분화 된 asp.net mvc 출력 캐시 부분을 무효화하십시오.

따라서, 예를 들어 :

/Image/User?id=1 
/Image/User?id=1&size=1 
/Image/User?id=1&size=2 

는 별도로 캐시 될 것이다.

주어진 사용자가 그림을 변경하면; 해당 사용자 ID (크기에 관계없이)에 대한 모든 출력 캐시 항목을 무효화하려고합니다. This question 하나의 특정 매개 변수에 대한 내 질문에 대한 대답. 그러나 ... 크기 매개 변수에 관계없이 사용자에 대한 캐시 된 응답을 모두 플러시하는 방법은 무엇입니까? (내가 'size'의 가능한 모든 값을 미리 알지 못한다고 가정 해 봅시다).

HttpResponse.RemoveOutputCacheItem("/Image/User?id=1&size=*"); //wishful thinking

사람이 올바른 방향으로 날 지점 수 :

내가 이상적으로 그런 짓을하고 싶습니다?

편집

@JcMalta 그러나 내가 출력 캐시에있는 항목들에 노출되어 적절한 수집을 찾을 수없는, 유망한 해결책을 제안했다. 실행 가능한 솔루션은 어딘가에 존재한다면 그가 제안한 것과 유사한 작업을 포함 할 수 있습니다.

답변

3

출력 캐시는 당신이 찾고있는 무엇을 수 있습니다 "캐시 종속성"의 개념이 .

.NET에는 디스크의 파일이 변경되면 캐시 항목이 자동으로 무효화되는 FileCacheDependency와 MSSQL 데이터베이스의 데이터가 변경 될 때 개체를 무효화하는 SqlCacheDependency가 있습니다. 사용자 정의 캐시 종속성을 작성할 수도 있습니다.

HttpResponse에는 Add * Dependency/iies라는 메소드가있어서 이것을 사용할 수 있습니다. 이미지가 디스크에있는 파일을 기반으로 한 경우

예를 들어, 크기가 조정 된 이미지를 제공하는 핸들러는 말할 수 :

HttpResponse.AddFileDependency(@"C:\images\user" + userId + ".jpg"); 

는이 응답에 대한 종속성을 등록합니다. 응답이 출력 캐시에 추가되면 모든 종속성이 함께 출력됩니다. 종속성이 변경되면 캐시 항목이 자동으로 무효화됩니다.

이미지가 파일 또는 SQL 데이터를 기반으로하는 경우,이 기능은 즉시 사용할 수 있습니다.

HttpResponse.AddCacheItemDependency를 사용하여 하나의 캐시 항목을 다른 캐시 항목에 종속시킬 수도 있습니다. 원본 이미지 URL "/ Image/User? id = 1"이 항상 캐시 된 경우 원본 크기에 따라 크기가 조정 된 이미지를 만들 수 있으며 원본의 HttpResponse.RemoveOutputCacheItem()은 모든 이미지를 지 웁니다.원본 이미지가 항상 캐시되지 않는 경우 (어쩌면 아무도 원본을 요청했지만 축소판 만 요청한 것일 수도 있음), 그러면 이것이 작동하지 않을 것이라고 생각합니다.

기본 제공 캐시 종속성이 작동하는 이유는 Windows와 SQL Server에 파일이나 데이터의 변경을 알리는 API가 내장되어 있기 때문입니다. 내장 된 캐시 의존성은 이러한 캐시를 둘러싼 래퍼입니다. 그러나 둘 다 적합하지 않다면 마지막 접근은 자신의 목적에 맞게 비슷한 것을 구현하는 것입니다.

기본 아이디어 (테스트되지 않음)는 CacheDependency를 하위 클래스로 지정하고 PictureCacheDependency라고합니다.

사용자가 그림을 편집 할 때 그림 편집 코드가 그림이 변경된 모든 관련 PictureCacheDependency 개체를 알 수 있도록 일종의 수신기/관찰자 패턴을 설정해야합니다. 그런 경우 PictureCacheDependency는 base.NotifyDependencyChanged를 호출해야하며 프레임 워크가 나머지를 처리합니다.

당신은 아마도 사용자 ID를 키로 사용하여 정적 사전 이벤트에 자체적으로 PictureCacheDependency 생성자를 등록하게 할 수 있습니다. 그러나 접근하여 접근 할 수 있도록 CacheDependency.DependencyDispose를 오버라이드하여 참조를 해제하십시오. 그렇지 않으면 메모리가 누출됩니다.

+0

답장을 보내 주셔서 감사합니다; HttpResponse.AddCacheItemDependency는 나를위한 좋은 옵션 인 것 같습니다. – DanP

1

정말이 내 머리 위로 떨어져입니다 ...하지만 아마도 올바른 방향으로 :

public void ClearCache(string myImagePrefix) 
{ 
    var cache = System.Web.HttpContext.Current.Cache; 

    IDictionaryEnumerator enumerator = cache.GetEnumerator(); 

    while (enumerator.MoveNext()) 
    { 
     string key = enumerator.Key.ToString(); 
     if(key.StartsWith(myImagePrefix) 
      cache.Remove(key); 
    } 
} 
+0

그냥 명확하게; httpcache가 아닌 출력 캐시를 대상으로하지만 전제는 동일 할 것입니다 ... – DanP

+0

불행히도, 적절한 컬렉션은 출력 캐시에 노출되지 않으므로 사용할 수 없습니다. 방법 (좋은 제안, 그래도) ... – DanP

관련 문제