VirtualPathProvider на IIS 6 неправильно обрабатывает кеширование файлового потока - PullRequest
1 голос
/ 17 февраля 2010

Я работаю над каркасом, в котором страницы .aspx и .master встроены в сборку, используя VirtualPathProvider для маршрутизации URL-адреса на определенный встроенный ресурс.

Пример URL: /_framework.aspx/mypage.aspx (который использует /_framework.aspx/mymaster.master)

  • _framework.aspx заставит IIS6 направить запрос через каркас ASP.NET
  • все, что после .aspx обрабатывается как PathInfo в .NET Framework

В веб-сервере Visual Studio 2008 виртуальный путь указан правильно: /_framework.aspx/mypage.aspx но в IIS6 виртуальный путь: /_framework.aspx

Если я запрашиваю два файла: /_framework.aspx/file1.css и /_framework.aspx/file2.css файл2 будет иметь то же содержимое, что и файл1.

Я подозреваю, что IIS6 учитывает путь к файлу (_framework.aspx) и кэширует поток файлов, возвращаемый из сборки, таким образом обрабатывая оба URL-адреса как один и тот же файл.

Временное решение:

Я реализовал класс CacheDependency, как этот

class ImmediateExpiryCacheDependency : System.Web.Caching.CacheDependency
{
    public ImmediateExpiryCacheDependency()
    {
        base.NotifyDependencyChanged(null, null);
    }
}

Срок действия файлового кэша истекает, но он не работает с главными страницами, я полагаю, потому что он запрашивается до истечения срока действия кэша через NotifyDependencyChanged.

Необходимое решение :

Если я вернул ноль в GetCacheDependency, IIS6 не истекает файл сразу. Как правильно немедленно истечь файл или полностью отключить кэширование. Более того, я хотел бы исправить способ, которым IIS6 работает с URL-адресом, поскольку кэширование на самом деле хорошо, если бы он использовал полный URL-адрес файла.

1 Ответ

0 голосов
/ 22 февраля 2010

Работая на веб-сервере разработки ASP.NET, я пришел к выводу, что правильный FilePath будет включать PathInfo, но теперь я понимаю, что реализация IIS верна.

Я изменил свой кодтак что файлы ASP.NET (aspx, ashx) будут иметь путь, например /_framework/Default.aspx (поскольку эти файлы будут маршрутизироваться без специальной настройки) с путем к главной странице, например /_framework/Site.master (поскольку этотмаршрутизируется внутри движка ASP.NET) и с ресурсами изображений с путем /_framework.ashx/image.gif (поскольку .ashx будет перенаправлен на механизм ASP.NET, откуда я затем буду использовать вид StaticFileHandler).

Таким образом, все страницы и ресурсы могут постоянно находиться и оставаться в сборке: -)

...