如何忽略ASP.NET Core 1.0.1中的路由?

时间:2016-09-15 18:17:41

标签: asp.net asp.net-mvc asp.net-core asp.net-core-mvc

以前,人们会将此类内容添加到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不是有效的方法。

6 个答案:

答案 0 :(得分:15)

你可以为此写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);
    }
}

答案 1 :(得分:5)

如果要在没有路由条件的情况下访问静态文件,只需使用内置StaticFiles Middleware。 使用app.UseStaticFiles();激活它 在Configure Method中,将静态文件放在wwwroot目录中。 它们适用于HOST / yourStaticFile

有关详细信息,请参阅here

答案 2 :(得分:4)

public void Configure

添加

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

答案 3 :(得分:3)

.NET Core 3.1

对于具有端点路由的.NET Core 3.1,这似乎是最简单的方法。您无需仅为这种简单情况构建中间件。

app.UseEndpoints(endpoints =>
{
    endpoints.MapGet("/favicon.ico", async (context) =>
    {
        context.Response.StatusCode = 404;
    });
    // more routing
});

答案 4 :(得分:2)

允许路由处理程序解析favicon请求,并将路由保持在最低限度。避免使用中间件,这只会增加代码的复杂性,并且意味着所有其他请求必须在路由处理程序之前通过中间件,这在繁忙网站的性能方面更糟糕。对于不忙的网站,你只会浪费时间来担心这个问题。

请参阅https://github.com/aspnet/Routing/issues/207

答案 5 :(得分:-1)

在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" });