更改ASP.net应用程序根目录?

时间:2010-12-03 22:44:58

标签: c# asp.net web-applications web-config

因此,ASP.net具有“应用程序根”的概念。它是URL的路径部分,对应于为IIS中的应用程序设置的根目录。波形符(〜)映射到ASP.net URL中的那条路径,所以如果ASP.net认为我的应用程序位于/ MyApp,那么服务器控件中我的URL为“〜/ Scripts / script.js”的内容将解析to(并发送到浏览器)“/ MyApp/Scr​​ipts/script.js”。

这是一个很长的镜头,但有没有办法可以随意更改此应用程序根目录?我实际上在另一个目录下有一个应用程序,我正在使用URL重写使它可用,而没有前缀目录名称,但ASP.net总是在我使用〜的任何地方前缀dir名称。我真的想让〜解决一个空字符串。可以做到吗?

3 个答案:

答案 0 :(得分:6)

您应该能够通过编写自定义VirtualPathProvider来更改〜映射到的内容的语义。这可能是它的样子。我在一个简单的案例中对此进行了测试,但它可能需要抛光。

我建议您在将其移动到真实场景之前,先使用它作为一个简单的测试应用程序。这样可以更容易地分离问题并对其进行迭代。

using System;
using System.Collections;
using System.IO;
using System.Linq;
using System.Web;
using System.Web.Caching;
using System.Web.Hosting;

public class TildeModifyingVPP : VirtualPathProvider {

    // Change this to what you want ~ to map to
    private const string PseudoRoot = "~/PseudoAppRoot/";

    public static void AppInitialize() {
        HostingEnvironment.RegisterVirtualPathProvider(new TildeModifyingVPP());
    }

    private string ResolvePath(string virtualPath) {
        // Make it app relative, i.e. ~/...
        virtualPath = VirtualPathUtility.ToAppRelative(virtualPath);

        // Change the ~/ to our pseudo root
        return PseudoRoot + virtualPath.Substring(2);
    }

    public override bool FileExists(string virtualPath) {
        return base.FileExists(ResolvePath(virtualPath));
    }

    public override VirtualFile GetFile(string virtualPath) {
        return new DelegatingVirtualFile(virtualPath, base.GetFile(ResolvePath(virtualPath)));
    }

    public override bool DirectoryExists(string virtualDir) {
        return base.DirectoryExists(ResolvePath(virtualDir));
    }

    public override VirtualDirectory GetDirectory(string virtualDir) {
        return new DelegatingVirtualDirectory(virtualDir, base.GetDirectory(ResolvePath(virtualDir)));
    }

    public override CacheDependency GetCacheDependency(string virtualPath, IEnumerable virtualPathDependencies, DateTime utcStart) {
        virtualPathDependencies = virtualPathDependencies.Cast<string>().Select(vpath => ResolvePath(vpath));
        return base.GetCacheDependency(virtualPath, virtualPathDependencies, utcStart);
    }
}

class DelegatingVirtualFile : VirtualFile {
    private VirtualFile _underlyingFile;
    public DelegatingVirtualFile(string virtualPath, VirtualFile underlyingFile): base(virtualPath) {
        _underlyingFile = underlyingFile;
    }

    public override Stream Open() {
        return _underlyingFile.Open();
    }
}

class DelegatingVirtualDirectory : VirtualDirectory {
    private VirtualDirectory _underlyingDir;
    public DelegatingVirtualDirectory(string virtualPath, VirtualDirectory underlyingDir)
        : base(virtualPath) {
        _underlyingDir = underlyingDir;
    }

    public override IEnumerable Children { get { return _underlyingDir.Children; } }
    public override IEnumerable Directories { get { return _underlyingDir.Directories; } }
    public override IEnumerable Files { get { return _underlyingDir.Files; } }
}

答案 1 :(得分:1)

因此,您在IIS中设置了站点,然后您在站点内创建了“应用程序”。您希望“应用程序”将CSS / JavaScript / Images解析为站点的根目录,而不是子应用程序吗?

为什么你需要将波浪号码放入?

为什么不做呢

“/脚本/的script.js” “/css/main.css”

所以它总是来自根目录。

答案 2 :(得分:0)

您将无法按照设置站点/应用程序的方式执行所需操作。应用程序根只是应用程序根目录的路径。如果您希望“网站”和“应用程序”都以“/”作为应用程序根目录,则必须创建两个网站并让它们收听不同的主机标题(例如:mysite.com和myapp.mysite。 COM)。这样,应用程序根目录是网站的根目录“/”,而不是应用程序文件夹的根目录。