配置IIS7通过ASP.NET运行时提供静态内容

4

我已经搜索了很久,但仍然找不到确定的答案。

如何配置IIS 7.0或在IIS中配置Web应用程序,以便ASP.NET Runtime处理所有请求,包括静态文件(如*.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;
}

基本思路如下:我们在 webapp 中有一个 branding 文件夹,其中包含每个“品牌”的文件夹,“品牌”等于主机名。也就是说,对 http://foo.example.com/ 的请求应该使用来自 branding/foo_example_com 的静态文件,而 http://bar.example.com/ 应该使用来自 branding/bar_example_com 的内容。
现在我想让 IIS 将所有静态文件的请求转发到 StaticFileHandler,然后使用这个整个“基础架构”并提供正确的文件。然而,无论我怎么尝试,我都无法配置 IIS 来实现这一点。

你是在询问如何强制所有请求都由ASP.NET请求处理程序处理,而不是IIS对这些类型的默认处理程序吗?还是你的IIS无法响应非ASPNET文件的请求?你的问题有点不清楚。 - SqlRyan
@rwmnau 谢谢!现在清楚了吗? - Anton Gogolev
它做到了-感谢编辑。 - SqlRyan
2个回答

5

如果应用程序池的Managed Pipeline Mode设置为默认值Integrated,则II7会自动处理所有请求,包括静态对象。在集成模式下,ASP.NET会处理所有请求,包括静态对象。

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

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


请看我的修改。在这种情况下,你的答案仍然适用吗? - Anton Gogolev

1
大家辛苦了,但问题出在完全不同的领域。
在预编译的网站中无法使用VirtualPathProvider。我很生气。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接