【发布时间】:2010-02-17 11:03:54
【问题描述】:
我正在开发一个框架,其中 .aspx 和 .master 页面嵌入在程序集中,使用 VirtualPathProvider 将 url 路由到特定的嵌入资源。
示例网址:/_framework.aspx/mypage.aspx(使用 /_framework.aspx/mymaster.master)
- _framework.aspx 将使 IIS6 通过 ASP.NET 框架路由请求
- .aspx 之后的所有内容在 .NET 框架中都被视为 PathInfo
在 Visual Studio 2008 Web 服务器中,virtualPath 正确:/_framework.aspx/mypage.aspx 但在 IIS6 中,virtualPath 是:/_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 请求的。
需要的解决方案:
如果我在 GetCacheDependency 中返回 null,IIS6 不会立即使文件过期。立即使文件过期或完全禁用缓存的正确方法是什么。更好的是,我想更正 IIS6 处理 url 的方式,因为缓存实际上很好,如果它使用完整的文件 url。
【问题讨论】:
-
我刚刚注意到母版页的检索方式实际上有所不同,可能是因为 ASP.NET 直接将请求处理到 VirtualPathProvider 而不涉及 IIS6。但是,所有其他资源仍被视为具有相同的路径。我上面写的自定义 CacheDependency 类似乎正确地过期了缓存,但我觉得相当难看......有什么想法可以避免它吗?
-
我的 IIS6 似乎因我的临时解决方案而崩溃 :-(
标签: iis-6 virtualpathprovider cache-dependency