VirtualPathProvider в IIS 6 неправильно обрабатывает кэширование файлового потока

Я работаю над структурой, в которой страницы .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.

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

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


person Matthew Peterson    schedule 17.02.2010    source источник
comment
Я только что заметил, что главная страница на самом деле извлекается по-другому, возможно, потому, что ASP.NET обрабатывает запрос непосредственно к VirtualPathProvider без участия IIS6. Однако все остальные ресурсы по-прежнему рассматриваются как имеющие один и тот же путь. Пользовательский класс CacheDependency, который я написал выше, кажется, корректно истечет срок действия кеша, но я чувствую себя довольно уродливым... Есть идеи, как этого избежать?   -  person Matthew Peterson    schedule 17.02.2010
comment
Кажется, мой IIS6 падает с моим временным решением :-(   -  person Matthew Peterson    schedule 17.02.2010


Ответы (1)


Благодаря моей работе на веб-сервере разработки 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).

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

person Matthew Peterson    schedule 22.02.2010