4

我搜索了一个高低,仍然找不到明确的答案。

如何在 IIS 中配置 IIS 7.0 或 Web 应用程序,以便 ASP.NET 运行时处理所有请求 - 包括对静态文件(如*.js*.gif等)的请求?

我正在尝试做的事情如下。

我们有一种 SaaSy 网站,我们可以为每个客户“打造品牌”。“品牌”意味着开发一个自定义母版页并使用一堆*.css和其他图像。

很自然,我正在使用VirtualPathProvider,它的操作如下:

public override System.Web.Hosting.VirtualFile GetFile(string virtualPath)
{
    if(PhysicalFileExists(virtualPath))
    {
        var virtualFile = base.GetFile(virtualPath);
        return virtualFile;
    }

    if(VirtualFileExists(virtualPath))
    {
        var brandedVirtualPath = GetBrandedVirtualPath(virtualPath);
        var absolutePath = HttpContext.Current.Server.MapPath(brandedVirtualPath);

        Trace.WriteLine(string.Format("Serving '{0}' from '{1}'", 
            brandedVirtualPath, absolutePath), "BrandingAwareVirtualPathProvider");

        var virtualFile = new VirtualFile(brandedVirtualPath, absolutePath);
        return virtualFile;    
    }

    return null;
}

基本思路如下:我们branding的 webapp 中有一个文件夹,该文件夹又包含每个“品牌”的文件夹,其中“品牌”等于主机名。也就是说,请求http://foo.example.com/应该使用来自 的静态文件branding/foo_example_com,而http://bar.example.com/应该使用来自branding/bar_example_com.

现在我想要 IIS 做的是将所有对静态文件的请求转发到StaticFileHandler,然后它将使用整个“基础设施”并提供正确的文件。但是,尽我所能,我无法配置 IIS 来执行此操作。

4

2 回答 2

5

Managed Pipeline Mode如果应用程序池设置为Integrated默认设置, II7 已经这样做了。在集成模式下,ASP.NET 处理所有请求,包括静态对象的请求。

如果您必须保留应用程序池,Classic Mode那么您需要使用在 IIS 6 中使用的相同技术为各种静态扩展显式创建处理程序。

基于评论的附加信息:我认为您缺少的部分是创建一个HttpHandler来处理其他扩展名(.js、.css 等)。如果没有这个,那么 ASP.NET 将对这些类型的文件使用默认处理。您将在 web.config 中创建对您的处理程序的引用。本文是为静态文件创建 HttpHandler 的示例。

于 2010-04-07T15:57:42.273 回答
1

向所有人致敬,但问题出在完全不同的领域。

VirtualPathProvider不能在预编译的网站中使用。我很生气。

于 2010-04-08T07:45:01.600 回答