1

我正在开发一个框架,其中 .aspx 和 .master 页面嵌入在程序集中,使用 VirtualPathProvider 将 url 路由到特定的嵌入资源。

示例 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。

4

1 回答 1

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 引擎,然后我将从那里使用一种静态文件处理程序)。

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

于 2010-02-22T13:05:55.843 回答