Использование.NET MVC 4.0 VirtualPathProviders в сценарии веб-фермы

У нас есть приложение, которое в значительной степени опирается на виртуальную файловую систему, которая расширяет архитектуру.NET System.Web.Hosting.VirtualPathProvider. Мы используем цепочку для поиска через... (A)contentresourceprovider (extends virtualpathprovider) (B) Assemblyresourceprovider (ditto) (C) физическая файловая система

Vpps регистрируются при инициализации приложения, так что...

HostingEnvironment.RegisterVirtualPathProvider(new AssemblyResourceProvider());
HostingEnvironment.RegisterVirtualPathProvider(new ContentResourceProvider());

Эта проблема связана с ContentResourceProvider (см. Ниже)

public class ContentResourceProvider : System.Web.Hosting.VirtualPathProvider
{
    #region Methods 

    public override bool FileExists(string virtualPath)
    {
        var result = ContentResourceProvider.IsContentResourcePath(virtualPath) ?     ((ContentResourceVirtualFile)this.GetFile(virtualPath)).Exists : Previous.FileExists(virtualPath);
        return result;
    }

    public override CacheDependency GetCacheDependency(string virtualPath, System.Collections.IEnumerable virtualPathDependencies, DateTime utcStart)
    {
        var result = ContentResourceProvider.IsContentResourcePath(virtualPath) ? new ContentResourceCacheDependency(virtualPath) : Previous.GetCacheDependency(virtualPath, virtualPathDependencies, utcStart);
        return result;
    }

    public override System.Web.Hosting.VirtualFile GetFile(string virtualPath)
    {
        var result = ContentResourceProvider.IsContentResourcePath(virtualPath) ? new ContentResourceVirtualFile(virtualPath) : Previous.GetFile(virtualPath);
        return result;
    }

    public override string GetFileHash(string virtualPath, System.Collections.IEnumerable virtualPathDependencies)
    {
        var result = base.GetFileHash(virtualPath, virtualPathDependencies);
        return result;
    }

    public static bool IsContentResourcePath(string virtualPath)
    {
        var pattern = @"~?/\(ContentManagementResource\)";
        var result = Regex.IsMatch(virtualPath, pattern, RegexOptions.CultureInvariant | RegexOptions.IgnoreCase);
        return result;
    }

    #endregion Methods 
}

По сути, все это прекрасно работает, и всякий раз, когда мы обновляем содержимое с помощью наших инструментов cms, виртуальные файлы и удаляются из кэша, а затем снова открываются / компилируются в бритвенные представления. Пока все хорошо... Однако мы недавно развернули это на ферме серверов, и кажется, что весь врожденный провайдер виртуальных файлов System.Web.Hosting не масштабируется (очевидно), это относительно конкретного сервера, на котором хранятся виртуальные файлы. память и т. д. Это означает, что если пользователь A вносит изменения в представление бритвы с помощью инструментов cms и операция выполняется на сервере A, пользователь B, вносящий другое изменение в сервер B, будет затем давать нежелательные результаты, несмотря на тот факт, что контент поступает с та же база данных. Это связано с тем, что виртуальные файловые системы, кеширующие бритвенные представления, являются уникальными для веб-сервера, на котором они работают, а также, кэш-зависимости запускаются только на соответствующем сервере.

Я пытался использовать пакеты распределенного кэша, такие как AppFabric, Memcached, NCache. Их недостаточно, потому что они зависят от того, как вы вручную пишете код, который вставляет сериализованные объекты в распределенный кеш. Во-первых, память.NET vpp эффективно управляется изнутри с применением строгих шаблонов проектирования, также класс CacheDependency не сериализуем.

Проведя много часов исследований, я не могу найти решение онлайн.

Конечно, вся системная архитектура.NET MVC 4.0 VirtualPathProvider/CacheDependency должна иметь возможность масштабирования более чем на один сервер?

Я думаю, исходя из моего понимания этого вопроса, я спрашиваю, есть ли способ масштабирования кэш-памяти System.Web.Host на нескольких серверах, чтобы виртуальный контент и зависимости кеша, прикрепленные к этим файлам, работали как задумано?

Любая помощь будет принята с благодарностью.

0 ответов

Другие вопросы по тегам