Виртуальный провайдер отключает кеширование? - PullRequest
8 голосов
/ 01 октября 2009

У меня есть провайдер виртуального пути. Проблема заключается в его кешировании моих файлов. Всякий раз, когда я вручную редактирую один из файлов aspx, на который он ссылается, VPP не извлекает новый файл, он продолжает использовать старый файл, пока я не перезапущу сайт.

Я даже перегрузил GetCacheDependency () в моем классе VirtualPathProvider:

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

Идеи

Ответы [ 5 ]

20 голосов
/ 18 ноября 2009

Возврат значения NULL по сути говорит ASP.NET, что у вас нет никакой зависимости - следовательно, ASP.NET не будет перезагружать элемент.

Вам нужно вернуть действительную зависимость, например,

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

Более правильный подход - убедиться, что вы обрабатываете только свои собственные зависимости кэша (это схематический пример):

 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);
    }
16 голосов
/ 04 июня 2013

Правильный способ отключить кеширование:

    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);
    }
2 голосов
/ 25 апреля 2013

Я не верю, что это то, что спросил оригинальный плакат. Он хочет полностью отключить кэширование, а не реализовать его лучше, хотя ваш пост полезен для последнего.

Очень многие люди используют VirtualPathProvider для извлечения данных из базы данных, а не из файловой системы. Я не понимаю, как создание зависимости файловой системы было бы полезным способом определить, когда пора обновлять файл.

Как бы вы заставили его никогда не использовать кэширование и всегда получать последнюю версию файла? Вот в чем вопрос.

1 голос
/ 04 апреля 2013
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);
}
0 голосов
/ 26 июля 2017

Решение, которое сработало для меня по желанию, было:

  • GetCacheDependency: вернуть ноль;
  • GetFileHash: return Guid.NewGuid (). ToString ();

Однако это решение приводит к зависанию сервера (Cassini, IIS 6, IIS 7, IIS 8). Зависание длится всего несколько минут, после чего результаты выдаются.

Я также включил тест для виртуального пути / файла с теми же результатами. Я перепутался с таймаутами браузера.

Может кто-нибудь помочь?

...