76

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書き換えることができます。次に、静的ファイルのハンドラーを作成します。ASP.NETは、この目的でを使用します。残念ながら、このクラスは内部です。リフレクションを使用してハンドラーを作成しようとしましたが、実際に機能します。/static/picture.jpg/a/b/c/picture.jpgStaticFileHandler

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);

しかし、内部型を使用することは適切な解決策ではないようです。もう1つのオプションは、独自の実装ですStaticFileHandlerが、適切に実装する(範囲やetagなどのHTTP関連のものをサポートする)ことは簡単ではありません。

ASP.NETで静的ファイルのルーティングにどのようにアプローチする必要がありますか?

4

5 に答える 5

57

IISを使用してこれを実行してみませんか?アプリケーションに到達する前に、最初のルートから2番目のルートへのリクエストをポイントするリダイレクトルールを作成できます。このため、リクエストをリダイレクトするためのより迅速な方法になります。

IIS7 +を使用しているとすると、次のようなことを行います...

<rule name="Redirect Static Images" stopProcessing="true">
  <match url="^static/?(.*)$" />
  <action type="Redirect" url="/a/b/c/{R:1}" redirectType="Permanent" />
</rule>

または、@ ni5ni6で提案されているように、リダイレクトする必要がない場合は、次のようにします。

<rule name="Rewrite Static Images" stopProcessing="true">
  <match url="^static/?(.*)$" />
  <action type="Rewrite" url="/a/b/c/{R:1}" />
</rule>

@RyanDawkinsの2015-06-17を編集

また、書き換えルールがどこに行くのか疑問に思っている場合は、web.configファイル内のその場所のマップを次に示します。

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <system.webServer>
    <rewrite>
      <rules>
        <!-- rules go below -->
        <rule name="Redirect Static Images" stopProcessing="true">
          <match url="^static/?(.*)$" />
          <action type="Redirect" url="/a/b/c/{R:1}" redirectType="Permanent" />
        </rule>
      </rules>
    </rewrite>
  </system.webServer>
</configuration>
于 2009-07-26T18:16:27.403 に答える
39

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

RegisterRoutes(RouteCollectionroots)に次の無視ルールを追加します。

routes.IgnoreRoute("{file}.js");
routes.IgnoreRoute("{file}.html");
于 2010-06-24T17:02:51.160 に答える
13

私も同様の問題を抱えています。HttpContext.RewritePathを使用することになりました:

public class MyApplication : HttpApplication
{
    private readonly Regex r = new Regex("^/static/(.*)$", RegexOptions.IgnoreCase);

    public override void Init()
    {
        BeginRequest += OnBeginRequest;
    }

    protected void OnBeginRequest(object sender, EventArgs e)
    {
        var match = r.Match(Request.Url.AbsolutePath);
        if (match.Success)
        {
            var fileName = match.Groups[1].Value;
            Context.RewritePath(string.Format("/a/b/c/{0}", fileName));
        }
    }
}
于 2010-10-17T06:26:23.933 に答える
7

私は内部を使用する代わりの方法を思いついたStaticFileHandlerIRouteHandler私は電話しますHttpServerUtility.Transfer

public class FileRouteHandler : IRouteHandler {

  public IHttpHandler GetHttpHandler(RequestContext requestContext) {
    String fileName = (String) requestContext.RouteData.Values["file"];
    // Contrived example of mapping.
    String routedPath = String.Format("/a/b/c/{0}", fileName);
    HttpContext.Current.Server.Transfer(routedPath);
    return null; // Never reached.
  }

}

これはハックです。はIRouteHandlerを返し、IHttpHandler中止して現在の要求を転送しないことになっています。しかし、それは実際に私が望むことを達成します。

内部を使用するStaticFileHandlerことも、アクセスするためにリフレクションが必要なため、ややハックですが、少なくとも、MSDNには、もう少し「公式」なクラスにするためのドキュメントがいくつかあります。StaticFileHandler残念ながら、部分的な信頼環境では内部クラスについて考えることはできないと思います。

StaticFileHandler近い将来ASP.NETから削除されるとは思わないので、使用を続けます。

于 2009-08-24T09:04:49.997 に答える
4

静的ファイルを処理するには、TransferRequestHandlerを追加する必要があります。次の回答を参照して くださいhttps://stackoverflow.com/a/21724783/22858

于 2014-02-12T10:19:38.987 に答える