VirtualPathProvider на IIS 6 неправильно обрабатывает кеширование потока файлов
Я работаю над фреймворком, в котором страницы.aspx и.master встроены в сборку, используя VirtualPathProvider для маршрутизации URL-адреса на определенный встроенный ресурс.
Пример URL: /_framework.aspx/mypage.aspx (который использует /_framework.aspx/mymaster.master)
- _framework.aspx заставит IIS6 направить запрос через ASP.NET framework
- все после.aspx обрабатывается как PathInfo в.NET Framework
В веб-сервере Visual Studio 2008 виртуальный путь является правильным: /_framework.aspx/mypage.aspx, но в IIS6 виртуальный путь является следующим: /_framework.aspx
Если я запрашиваю два файла: /_framework.aspx/file1.css и /_framework.aspx/file2.css, файл file2 будет иметь тот же контент, что и file1.
Я подозреваю, что IIS6 учитывает путь к файлу (_framework.aspx) и кэширует поток файлов, который возвращается из сборки, таким образом обрабатывая оба URL-адреса как один и тот же файл.
Временное решение:
Я реализовал класс CacheDependency, как это
class ImmediateExpiryCacheDependency : System.Web.Caching.CacheDependency
{
public ImmediateExpiryCacheDependency()
{
base.NotifyDependencyChanged(null, null);
}
}
Теперь он истекает кеш файлового потока, но не работает с мастер-страницами, я думаю, потому что он запрашивается до истечения срока действия кеша через NotifyDependencyChanged.
Необходимое решение:
Если я вернул null в GetCacheDependency, IIS6 не истекает файл сразу. Как правильно немедленно истечь файл или полностью отключить кэширование. Более того, я хотел бы исправить способ, которым IIS6 работает с URL-адресом, поскольку кэширование на самом деле хорошо, если бы он использовал полный URL-адрес файла.
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).
Таким образом, все страницы и ресурсы могут находиться и оставаться полностью в сборке:-)