web-dev-qa-db-ja.com

ASP.NET Core 1.0.1でルートを無視する方法は?

以前は、次のようなものをGlobal.aspx.csに追加していました。これは.NET Coreにはありません。

  routes.IgnoreRoute("{*favicon}", new { favicon = @"(.*/)?favicon.ico(/.*)?" });

これが私のStartup.csに現在あるものです(.NET Coreの場合):

  app.UseDefaultFiles();

  app.UseStaticFiles();

  app.UseMvc(routes =>
  {
      routes.MapRoute(
          name: "default",
          template: "{controller=Home}/{action=Index}/{id?}");

      routes.MapSpaFallbackRoute(
          name: "spa-fallback",
          defaults: new { controller = "Home", action = "Index" });
  });

問題は、MVC(pre-Core)ではroutesRouteCollectionであり、.NET CoreではMicrosoft.AspNetCore.Routing.IRouteBuilderであるため、IgnoreRouteは有効なメソッドではないということです。

13
Jeff Guillaume

このために middleware と書くことができます。

public void Configure(IApplciationBuilder app) {
    app.UseDefaultFiles();

    // Make sure your middleware is before whatever handles 
    // the resource currently, be it MVC, static resources, etc.
    app.UseMiddleware<IgnoreRouteMiddleware>();

    app.UseStaticFiles();
    app.UseMvc();
}

public class IgnoreRouteMiddleware {

    private readonly RequestDelegate next;

    // You can inject a dependency here that gives you access
    // to your ignored route configuration.
    public IgnoreRouteMiddleware(RequestDelegate next) {
        this.next = next;
    }

    public async Task Invoke(HttpContext context) {
        if (context.Request.Path.HasValue &&
            context.Request.Path.Value.Contains("favicon.ico")) {

            context.Response.StatusCode = 404;

            Console.WriteLine("Ignored!");

            return;
        }

        await next.Invoke(context);
    }
}
15
Technetium

ルーティング条件なしで静的ファイルにアクセスできるようにするには、ビルドイン_StaticFiles Middleware_を使用します。 Configureメソッドのapp.UseStaticFiles();でアクティブ化し、静的ファイルをwwwrootディレクトリに配置します。 Host/yourStaticFileで利用できます

詳細については、 ここ を参照してください

5
Oguzhan

内部public void Configure

追加

app.Map("/favicon.ico", delegate { });
4
Zam

ファビコンリクエストがルートハンドラーによって解析されることを許可し、ルートを最小限に抑えます。ミドルウェアの使用は避けてください。これにより、コードがさらに複雑になり、他のすべてのリクエストはルートハンドラーの前にミドルウェアを通過する必要があります。忙しくないWebサイトの場合、これについて心配するだけで時間を無駄にすることになります。

https://github.com/aspnet/Routing/issues/207 を参照してください

3
Matthew Bonner

ASP.NET Coreでは、制約されたキャッチオールルートテンプレートを作成できます。これを行うには、ASP.NET Coreの例で、routes.MapSpaFallbackRouteの呼び出しを次のように置き換えます。

// Returns the home/index page for unknown files, except for
// favicon.ico, in which case a 404 error is returned.
routes.MapRoute(
    name: "spa-fallback",
    template: "{*url:regex(^(?!favicon.ico).*$)}",
    defaults: new { Controller = "Home", action = "Index" });
0
Marc Sigrist