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

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

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

您应该能够通过编写自定义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, ie ~/... 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().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; } } } 

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

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

为什么不这样做

“/scripts/script.js”“/ css / main.css”

所以它总是来自根目录。

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