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/Scripts/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, 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)
| 归档时间: |
|
| 查看次数: |
6016 次 |
| 最近记录: |