因此,ASP.net具有“应用程序根”的概念。它是URL的路径部分,对应于为IIS中的应用程序设置的根目录。波形符(〜)映射到ASP.net URL中的那条路径,所以如果ASP.net认为我的应用程序位于/ MyApp,那么服务器控件中我的URL为“〜/ Scripts / script.js”的内容将解析to(并发送到浏览器)“/ MyApp/Scripts/script.js”。
这是一个很长的镜头,但有没有办法可以随意更改此应用程序根目录?我实际上在另一个目录下有一个应用程序,我正在使用URL重写使它可用,而没有前缀目录名称,但ASP.net总是在我使用〜的任何地方前缀dir名称。我真的想让〜解决一个空字符串。可以做到吗?
答案 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)。这样,应用程序根目录是网站的根目录“/”,而不是应用程序文件夹的根目录。