gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 21:30:41 24 4
gpt4 key购买 nike

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

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

最佳答案

您应该能够通过编写自定义 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; } }
}

关于c# - 更改 ASP.net 应用程序根目录?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4350571/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com