我刚为ASP.NET Web应用程序创建了一个自定义的VirtualPathProvider。它基本上将“〜/ Storage”和子目录中的所有虚拟文件映射到解决方案目录以外的目录。
private bool IsPathVirtual(string virtualPath)
{
String checkPath = VirtualPathUtility.ToAppRelative(virtualPath);
return checkPath.StartsWith(VirtualRootPath, StringComparison.InvariantCultureIgnoreCase);
}
public override bool DirectoryExists(string virtualDir)
{
return IsPathVirtual(virtualDir) ? ((FileSystemVirtualDirectory)GetDirectory(virtualDir)).Exists() : Previous.DirectoryExists(virtualDir);
}
public override bool FileExists(string virtualPath)
{
return IsPathVirtual(virtualPath) ? ((FileSystemVirtualFile)GetFile(virtualPath)).Exists() : Previous.FileExists(virtualPath);
}
在我的情况下VirtualRootPath = "~/Storage"
,但它可以配置。
在IIS Express中,当我通过Visual Studio进行调试时,并不总是调用解析虚拟路径所需的两个公共方法。
http://localhost:7749/Storage
会触发两种方法的断点。返回并且需要404错误。这对我来说是正确的行为http://localhost:7749/Storage/ExistingFile.txt
不会触发调试,并返回不同的404错误。这不正确两个404错误之间的区别在于,当我调用目录时,它是ASP.NET响应(Server error in application '/'
)但是当我调用该目录中的文件时,它是IIS 8.0响应({{1 }})。
为什么即使我在HTTP Error 404.0 - Not Found
中正确注册VirtualPathProvider
,IIS 8.0是否允许ASP.NET管道处理HTTP请求以便正确解析?
阅读VirtualPathProvider doesn't (quite) work in production on IIS 7.5后,我意识到这可能是HostingEnvironment
问题。从另一个问题来看,无论ASP.NET是将虚拟资源映射到虚拟资源,控制器还是其他任何东西,它都看起来像一样,IIS独立处理某些文件扩展。因此,由于我试图读取XML文件(可能不是JPEG),因此IIS并没有打扰ASP.NET。
解决方法一直将此行放在Web.config
的{{1}}部分中:
Web.config
但是这种解决方法仅适用于XML文件。如何对存储目录下的所有文件进行永久性修复?
答案 0 :(得分:0)
您可以将存储目录指定为配置中“路径”字段的一部分,如下所示:
<add name="AspNetStaticFileHandler-Storage" path="Storage/*" verb="*" type="System.Web.StaticFileHandler" />