【问题标题】:VirtualPathProvider on IIS 6 does not handle file stream caching correctlyIIS 6 上的 VirtualPathProvider 无法正确处理文件流缓存
【发布时间】: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


【解决方案1】:

通过我在 ASP.NET 开发 Web 服务器中的工作,我得出的结论是正确的 FilePath 将包含 PathInfo,但我现在明白 IIS 实现是正确的。

我更改了我的代码,以便 ASP.NET 文件(aspx、ashx)具有诸如 /_framework/Default.aspx 之类的路径(因为这些文件将在没有特殊配置的情况下路由)和诸如 /_framework 之类的母版页路径/Site.master(因为这是在 ASP.NET 引擎内部路由的)和带有路径 /_framework.ashx/image.gif 的图像资源(因为 .ashx 将被路由到 ASP.NET 引擎,我从那里然后将使用一种 StaticFileHandler)。

这样,所有页面和资源都可以驻留并完全保留在程序集中:-)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-08-01
    • 2012-01-04
    • 2014-09-16
    • 2012-01-31
    • 1970-01-01
    • 2012-11-30
    • 2016-12-28
    相关资源
    最近更新 更多