2009-10-01 5 views
7

가상 경로 공급자가 있습니다. 문제는 파일을 캐싱하는 것입니다. VPP가 참조하는 aspx 파일 중 하나를 수동으로 편집 할 때마다 VPP는 새 파일을 가져 오지 않고 사이트를 다시 시작할 때까지 이전 파일을 계속 재사용합니다.가상 경로 공급자가 캐싱을 비활성화합니까?

내 VirtualPathProvider 클래스의 GetCacheDependency()를 타고 오버도했습니다 :

public override CacheDependency GetCacheDependency(string virtualPath, IEnumerable virtualPathDependencies, DateTime utcStart) 
    { 
     return null; 
    } 

아이디어?

답변

19

null을 반환하면 기본적으로 ASP.NET에 의존성이 없음을 알립니다. 따라서 ASP.NET은 항목을 다시로드하지 않습니다.

필요한 것은 유효한 의존성을 반환하는 것입니다.

public override CacheDependency GetCacheDependency(string virtualPath, IEnumerable virtualPathDependencies, DateTime utcStart) 
    { 
     if (isMyVirtualPath(virtualPath)) 
      return new CacheDependency(getPhysicalFileName(virtualPath)); 
     else 
      return new Previous.GetCacheDependency(virtualPath, virtualPathDependencies, utcStart); 
    } 
+1

정답 더 아래/찬디 마 프레 타티 케 – r3mark

1
public override CacheDependency GetCacheDependency(string virtualPath, IEnumerable virtualPathDependencies, DateTime utcStart) 
{ 
    return IsVirtualPath(virtualPath) ? new CacheDependency(HttpContext.Current.Server.MapPath("~/Resource.xml")) 
            : Previous.GetCacheDependency(virtualPath, virtualPathDependencies, utcStart); 
} 
2

나는 이것을 믿지 않는 무엇이다 :

public override CacheDependency GetCacheDependency(string virtualPath, IEnumerable virtualPathDependencies, DateTime utcStart) 
    { 
     return new CacheDependency(getPhysicalFileName(virtualPath)); 
    } 

더 정확한 방법은 당신이 단지 자신의 캐시 의존성을 처리 있는지 확인하는 것입니다 (이것은 개략적 인 예입니다) 원래의 포스터가 물었다. 그는 캐싱을 완전히 비활성화하고 더 나은 방법으로 구현하지 않으려하지만, 게시물이 후자의 경우 유용합니다.

많은 사람들이 VirtualPathProvider를 사용하여 파일 시스템 대신 데이터베이스에서 데이터를 가져 왔습니다. 파일 시스템 의존성을 만드는 것이 파일을 새로 고치는 시간을 결정하는 유용한 방법이되는 방법을 알지 못합니다.

어떻게 캐싱을 사용하지 않고 항상 최신 버전의 파일을 검색합니까? 그것은 질문입니다.

+0

응답이 여기에 있습니다 : http://stackoverflow.com/questions/3747858/asp-net-mvc-2-virtualpathprovider-getfile-every-time-for-every- 요청/3766321 # 3766321 – Aliz

14

캐싱을 사용하지 않도록하는 올바른 방법이 있습니다 :

public override CacheDependency GetCacheDependency(string virtualPath, IEnumerable virtualPathDependencies, DateTime utcStart) 
    { 
     if (_IsLayoutFile(virtualPath)) 
     { 
      return null; 
     } 
     return Previous.GetCacheDependency(virtualPath, virtualPathDependencies, utcStart); 
    } 

    public override String GetFileHash(String virtualPath, IEnumerable virtualPathDependencies) 
    { 
     if (_IsLayoutFile(virtualPath)) 
     { 
      return Guid.NewGuid().ToString(); 
     } 

     return Previous.GetFileHash(virtualPath, virtualPathDependencies); 
    } 
+0

가정에 따라 null 캐시 종속성을 반환하면 VPP가 getfilehash를 사용하게됩니까? –

+0

나는 사실을 알아 냈습니다. null CacheDependecy를 반환하면 VPP가 GetFileHash를 사용하게됩니다. –

-1

원하는대로 나를 위해 일한 솔루션했다 :

  • GetCacheDependency :는 null;
  • GetFileHash : return Guid.NewGuid(). ToString();

그러나이 솔루션을 사용하면 서버가 중지됩니다 (Cassini, IIS 6, IIS 7, IIS 8). 교수형은 몇 분 동안 지속 된 다음 결과가 전달됩니다.

동일한 결과를 가진 가상 경로/파일 테스트도 포함 시켰습니다. 나는 브라우저 타임 아웃을 망쳤다.

아무도 도와 줄 수 있습니까?

+0

새로운 질문을해야합니다. 대답 안의 질문을하지 마십시오. – Difster

+0

좋아요. 여기에 질문 : https : // stackoverflow.co.kr/questions/45320336/virtualpathprovider-disabling-caching-hangs-server-iis-and-cassini – jbecker

관련 문제