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