Поставщик виртуального пути для обслуживания файлов Razor из внешнего расположения. Когда файл Razor изменяется, каким-либо образом не требуется перезапуск пула приложений?

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

Как я могу пометить или истечь срок действия Razor-файла, предоставляемого через виртуального поставщика файлов, чтобы ASP.NET забрал мои новые Razor-изменения без перезапуска пула приложений?


person Joshua Enfield    schedule 21.05.2014    source источник


Ответы (1)


Это, безусловно, возможно.

Вам просто нужно создать свой собственный VirtualPathProvider (что, похоже, вы уже сделали), и обязательно переопределите метод:

public override CacheDependency GetCacheDependency(string virtualPath, 
                          IEnumerable virtualPathDependencies, DateTime utcStart)

Когда я сделал это, мой сценарий требовал только возвращения зависимости кэша от физического пути к файлу, например.

string physicalPath = GetPhysicalPath(virtualPath);
return new CacheDependency(physicalPath);

В зависимости от того, что вы делаете, этого может быть или не быть достаточно.

В моем конкретном сценарии мне не нужно было беспокоиться о случае, когда virtualPathDependencies имеет несколько записей (что может произойти, например, если virtualPath представляет каталог, содержащий несколько файлов). Мой провайдер также был довольно простым — в большинстве случаев я делегировал провайдеру по умолчанию.

Вы, вероятно, уже знаете это, но для будущих читателей также обязательно зарегистрируйте провайдера виртуального пути, например. в Application_Start() из global.asax, что можно сделать так:

//get the default provider if your custom provider delegates to it.
var defaultProvider = HostingEnvironment.VirtualPathProvider;
//register the custom provider.
HostingEnvironment.RegisterVirtualPathProvider(new MyCustomVirtualPathProvider(defaultProvider));
person Nathan    schedule 06.10.2014