自定义VirtualPathProvider故障排除

时间:2013-05-12 21:34:22

标签: asp.net visual-studio-2012 iis-8 virtualpathprovider

我刚为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文件。如何对存储目录下的所有文件进行永久性修复?

1 个答案:

答案 0 :(得分:0)

您可以将存储目录指定为配置中“路径”字段的一部分,如下所示:

<add name="AspNetStaticFileHandler-Storage" path="Storage/*" verb="*" type="System.Web.StaticFileHandler" />
相关问题