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 を介してデバッグすると、仮想パスを解決するために必要な 2 つのパブリック メソッドが常に呼び出されるとは限りません。
- 呼び出す
http://localhost:7749/Storage
と、両方のメソッドでブレークポイントがトリガーされます。404 エラーが返されます。これは私にとって正しい行動です - 呼び出し
http://localhost:7749/Storage/ExistingFile.txt
てもデバッグはトリガーされず、別の 404 エラーが返されます。これは正しくありません
2 つの 404 エラーの違いは、ディレクトリを呼び出すと ASP.NETServer error in application '/'
が応答する ( ) のに対し、そのディレクトリ内のファイルを呼び出すと IIS 8.0 が応答する ( HTTP Error 404.0 - Not Found
) ことです。
質問
を に正しく登録したとしても、VirtualPathProvider
IIS HostingEnvironment
8.0 では ASP.NET パイプラインが HTTP 要求を処理しないため、正しく解決できないのはなぜですか?
回避策
VirtualPathProvider does not (quite) work in production on IIS 7.5を読んだ後、それが問題になる可能性があることに気付きましたWeb.config
。他の質問から判断すると、ASP.NET がそれらを仮想リソース、コントローラー、またはその他にマップするかどうかに関係なく、IIS は特定のファイル拡張子を個別に処理するようです。つまり、XML ファイル (おそらく JPEG ではない) を読み込もうとしていたので、IIS は ASP.NET を気にしませんでした。
回避策として、次の行をWeb.config
のsystem.webServer.handlers
セクションに追加しました:
<add name="AspNetStaticFileHandler-XML" path="*.xml" verb="*" type="System.Web.StaticFileHandler" />
ただし、この回避策は XML ファイルに対してのみ機能します。ストレージ ディレクトリの下のすべてのファイルに対して機能する永続的な修正を行うにはどうすればよいですか?