1. ホーム
  2. asp.net

ASP.NETルーティングを使用して静的ファイルを提供する

2023-08-30 15:43:44

質問

ASP.Net ルーティング (MVC ではない) を使用して、静的ファイルを提供することはできますか?

例えば

http://domain.tld/static/picture.jpg

から

http://domain.tld/a/b/c/picture.jpg

で、書き換えられたURLはその場で計算されるという意味で、動的に行いたいのです。静的なルートを一々設定するわけにはいきません。

とにかく、こんな感じでルートを作ればいいんです。

routes.Add(
  "StaticRoute", new Route("static/{file}", new FileRouteHandler())
);

の中で FileRouteHandler.ProcessRequest メソッドからパスを書き換えることができます。 /static/picture.jpg から /a/b/c/picture.jpg . 次に、静的ファイル用のハンドラを作成したいと思います。ASP.NETでは StaticFileHandler をこの目的のために使用します。残念ながら、このクラスは内部的なものです。私はリフレクションを使ってハンドラを作成しようとし、実際に動作しました。

Assembly assembly = Assembly.GetAssembly(typeof(IHttpHandler));
Type staticFileHandlerType = assembly.GetType("System.Web.StaticFileHandler");
ConstructorInfo constructorInfo = staticFileHandlerType.GetConstructor(BindingFlags.NonPublic | BindingFlags.Instance, null, Type.EmptyTypes, null);
return (IHttpHandler) constructorInfo.Invoke(null);

しかし、内部型を使うのは適切な解決策ではないようです。もう一つの選択肢は、私自身の StaticFileHandler を実装することですが、適切に行うこと (範囲や etag のような HTTP のものをサポートすること) は、自明なことではありません。

ASP.NETで静的ファイルのルーティングにどのようにアプローチすべきですか?

どのように解決するのですか?

この問題を数時間掘り下げた結果、無視ルールを追加するだけで、静的ファイルが提供されるようになることがわかりました。

RegisterRoutes(RouteCollection routes)で、以下の無視ルールを追加します。

routes.IgnoreRoute("{file}.js");
routes.IgnoreRoute("{file}.html");