2016-09-15 11 views
9

Wcześniej można by dodać coś takiego Global.aspx.cs, który poszedł w .NET Rdzeń:Jak ignorować trasy w programie ASP.NET Core 1.0.1?

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

Oto co obecnie mam w moim Startup.cs (NET rdzenia):

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

Problem polega na tym, że w MVC (pre-Core) routes był RouteCollection, a .NET Core to Microsoft.AspNetCore.Routing.IRouteBuilder, więc IgnoreRoute nie jest prawidłową metodą.

Odpowiedz

11

Możesz napisać o tym 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

Dziękuję bardzo za to, ale gotować go: muszę wymienić jedną linię kodu z całego niestandardowego trasie? Wydaje się trochę nadęty. –

+1

Być może? Może istnieć sposób w .NET Core, który bardziej bezpośrednio odnosi się do twojego problemu. Być może za pośrednictwem oprogramowania pośredniczącego do routingu. Po prostu nie wpadłem na to. Przeczytałem ten dokument, a następnie zapoznałem się z kodem źródłowym, aby uzyskać coś bardziej ostatecznego: https://docs.asp.net/en/latest/fundamentals/routing.html – Technetium

+0

Dzięki, zostawię to otwarte dla innych potencjalnych odpowiedzi teraz. Jeśli twój koniec okaże się najlepszym wyborem, wrócę i oznaczy go w późniejszym terminie! (Nie martw się, ciągle używam SO.) –

4

Jeśli chcesz, aby plik statyczny dostępne bez warunku routingu, wystarczy skorzystać z wbudowanych w StaticFiles Middleware. Aktywuj go za pomocą app.UseStaticFiles(); w Configure Method i umieść pliki statyczne w katalogu wwwroot. Są availible na host/yourStaticFile

Aby uzyskać więcej informacji, patrz here

+2

Witamy w Stack Overflow! Jesteś na dobrej drodze, choć w sformułowaniu jest to bardziej poszukiwanie komentarzy, wyjaśnienie niż odpowiedź. Możesz przeformułować trochę jak "Jeśli próbujesz stworzyć pliki statyczne, możesz użyć ..." i może podać przykład w kontekście. Jeśli uzyskasz reputację 50 lub więcej, zamiast tego będziesz mógł dodawać komentarze. Oto [http://stackoverflow.com/help/privileges] (lista przywilejów i reputacja, których potrzebujesz, aby uzyskać każdy z nich). Powodzenia! –

2

wewnątrz public void Configure

dodać

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

Zezwalaj na żądania favicon być przetwarzane przez procedurę obsługi trasy i utrzymać Twoje trasy do minimum. Unikaj używania oprogramowania pośredniczącego, co po prostu dodaje dodatkowej złożoności do kodu i oznacza, że ​​wszystkie inne żądania muszą przejść przez oprogramowanie pośredniczące przed obsługą tras, co jest gorsze pod względem wydajności w przypadku obciążonych stron internetowych. W przypadku witryn, które nie są zajęte, marnujesz czas, martwiąc się o to.

Zobacz https://github.com/aspnet/Routing/issues/207