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

Jez*_*Jez 6 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名称.我真的想让〜解决一个空字符串.可以做到吗?

Dav*_*bbo 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; } }
}
Run Code Online (Sandbox Code Playgroud)