我搜索了一个低,仍然找不到一个明确的答案。
如何在IIS中配置IIS 7.0或Web应用程序,以便ASP.NET运行时将处理所有请求 - 包括*.js
,{{1}等静态文件的请求等等?
我要做的是如下。
我们有一种SaaSy网站,我们可以为每个客户“品牌化”。 “品牌”意味着开发自定义母版页并使用一堆*.gif
和其他图像。
很自然地,我正在使用*.css
,其运作方式如下:
VirtualPathProvider
基本思路如下:我们的webapp中有一个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
的请求应使用http://foo.example.com/
中的静态文件,而branding/foo_example_com
应使用http://bar.example.com/
中的内容。
现在我想要IIS做的是将所有请求转发到静态文件到branding/bar_example_com
,然后使用整个“基础架构”并提供正确的文件。但是,尽我所能,我无法配置IIS来执行此操作。
答案 0 :(得分:5)
Managed Pipeline Mode
设置为Integrated
(默认值),那么II7已经这样做了。在集成模式下,ASP.NET处理所有请求,包括静态对象的请求。
如果必须将应用程序池保留在Classic Mode
中,则需要使用在IIS 6中使用的相同技术来显式创建各种静态扩展的处理程序。
基于评论的其他信息:我认为您缺少的部分是创建HttpHandler
来处理其他扩展名(.js,.css等)。如果没有这个,那么ASP.NET将使用这些类型文件的默认处理。您将在web.config中创建对处理程序的引用。 This article是为静态文件创建HttpHandler的示例。
答案 1 :(得分:1)
感谢所有人,但问题在于完全不同的空间。
VirtualPathProvider
不能用于预编译的网站。我很生气。