ASP.NET MVCで同じ名前のフォルダーとコントローラーを使用する方法
-
08-07-2019 - |
質問
DownloadsというMVCコントローラーがあります。 http:// mysite / Downloads
http://mysite/Downloads/MyFile.zipという物理フォルダーに物理ファイルを配置したい。
フォルダを作成するだけの場合、 http:// mysite / Downloads にアクセスすると403が表示されます。 (ほとんどの場合、ディレクトリの参照が無効になっています) しかし、代わりにMVCコントローラーを起動したいです。
どうすればいいですか?
解決
http:// mysite / Downloads / {ACTION}
を参照すると、コントローラーアクションが起動します。
この例で機能しないのは、アクションのない / Downloads
だけです。このURLを書き換えて、デフォルトのアクションにリダイレクトできます。
さらに、ルートハンドラーにダウンロードファイルを無視させる必要があります。 global.asaxファイルに行を追加して、すべてのzipファイルまたはその他の適切な無視パターンを無視できます。
routes.Ignore("{resource}.zip");
他のヒント
.NET 3.5以降、既存のファイルをルーティングできます:
public static void RegisterRoutes(RouteCollection routes) {
routes.RouteExistingFiles = true;
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home",
action = "Index",
id = UrlParameter.Optional }
);
}
audio.mp3
ファイルを含む Markets
というサイトルートにフォルダーがあるとします:
\Markets
\Markets\audio.mp3
MarketsController
が存在すると仮定して、 Markets
をリクエストした場合、 Markets / Index
にルーティングされます。
/Markets/audio.mp3
をリクエストした場合、mp3ファイルを取得し、 Markets / AnythingElse
をリクエストした場合、通常のルーティングが適用されます。