IIS 6上的VirtualPathProvider无法正确处理文件流缓存

时间:2010-02-17 11:03:55

标签: iis-6 virtualpathprovider cache-dependency

我正在开发一个框架,其中.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,缓存实际上是好的。

1 个答案:

答案 0 :(得分:0)

通过我在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)。

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