2015-02-10 30 views
12

In ASP.NET Core, c'è un modo per visualizzare un elenco di tutti i percorsi definiti in Avvio? Stiamo utilizzando il metodo di estensione MapRoute di IRouteBuilder per definire i percorsi.Ottieni l'elenco di tutti i percorsi

Stiamo migrando un progetto WebAPI di progetto precedente. Lì potremmo usare GlobalConfiguration.Configuration.Routes per ottenere tutti i percorsi.

In particolare, lo stiamo facendo all'interno di un filtro azione.

public class MyFilter : ActionFilterAttribute 
{  
    public override void OnActionExecuting(ActionExecutingContext actionContext) 
    { 
     base.OnActionExecuting(actionContext); 

     // This no longer works 
     // var allRoutes = GlobalConfiguration.Configuration.Routes; 

     // var allRoutes = ??? 
    } 
} 

risposta

2

È possibile ottenere una HttpRouteCollection dal HttpActionContext via:

actionContext.RequestContext.Configuration.Routes 

RequestContext

HttpConfiguration

HttpRouteCollection

- Dopo domanda aggiornato -

ActionExecutingContext ha una proprietà RouteData ereditata da ControllerContext, che espone la proprietà DataTokens (che è un dizionario del valore del percorso). Non è forse la stessa collezione si è abituati a lavorare con, ma fornisce l'accesso a quella raccolta:

actionContext.RouteData.DataTokens 

DataTokens

+0

Ok - questo è un dizionario vuoto nel mio caso. E RouteData sembra contenere dati relativi al percorso corrente, non un elenco di tutti i percorsi. – clhereistian

+0

'actionContext.RequestContext.Configuration.Routes' non esiste più. –

14

per arrivare a tutti i percorsi, è necessario utilizzare la parte ApiExplorer di MVC. È possibile contrassegnare tutte le azioni con un attributo o utilizzare una convenzione come questo:

public class ApiExplorerVisibilityEnabledConvention : IApplicationModelConvention 
{ 
    public void Apply(ApplicationModel application) 
    { 
     foreach (var controller in application.Controllers) 
     { 
      if (controller.ApiExplorer.IsVisible == null) 
      { 
       controller.ApiExplorer.IsVisible = true; 
       controller.ApiExplorer.GroupName = controller.ControllerName; 
      } 
     } 
    } 
} 

In Startup.cs, aggiungere il nuovo in ConfigureServices(...)

public void ConfigureServices(IServiceCollection services) 
{ 
    services.AddMvc(
     options => 
     { 
      options.Conventions.Add(new ApiExplorerVisibilityEnabledConvention()); 
      options. 
     } 
} 

nel costruttore ActionFilter è quindi possibile utilizzare iniezione per ottenere l'ApiExplorer:

public class MyFilter : ActionFilterAttribute 
{  
    private readonly IApiDescriptionGroupCollectionProvider descriptionProvider; 

    public MyFilter(IApiDescriptionGroupCollectionProvider descriptionProvider) 
    { 
     this.descriptionProvider = descriptionProvider; 
    } 

    public override void OnActionExecuting(ActionExecutingContext actionContext) 
    { 
     base.OnActionExecuting(actionContext); 

     // The convention groups all actions for a controller into a description group 
     var actionGroups = descriptionProvider.ApiDescriptionGroups.Items; 

     // All the actions in the controller are given by 
     var apiDescription = actionGroup.First().Items.First(); 

     // A route template for this action is 
     var routeTemplate = apiDescription.RelativePath 
    } 
} 

ApiDescription, che ha la RelativePath, che è il modello di percorso per quella route:

// Copyright (c) .NET Foundation. All rights reserved. 
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. 

using System; 
using System.Collections.Generic; 
using Microsoft.AspNetCore.Mvc.Abstractions; 
using Microsoft.AspNetCore.Mvc.ModelBinding; 

namespace Microsoft.AspNetCore.Mvc.ApiExplorer 
{ 
    public class ApiDescription 
    { 
     public string GroupName { get; set; } 
     public string HttpMethod { get; set; } 
     public IList<ApiParameterDescription> ParameterDescriptions { get; } = new List<ApiParameterDescription>(); 
     public IDictionary<object, object> Properties { get; } = new Dictionary<object, object>(); 
     public string RelativePath { get; set; } 
     public ModelMetadata ResponseModelMetadata { get; set; } 
     public Type ResponseType { get; set; } 
     public IList<ApiRequestFormat> SupportedRequestFormats { get; } = new List<ApiRequestFormat>(); 
     public IList<ApiResponseFormat> SupportedResponseFormats { get; } = new List<ApiResponseFormat>(); 
    } 
} 
+0

Vorrei poter sopravvivere questo 100 volte. È così difficile trovare documenti su ApiExplorer in AspNetCore e gli esempi su github di Microsoft non sono aggiornati. Grazie! – rrreee

+0

Solo per chiarezza, è anche la sostituzione per l'utilizzo del globale 'RouteTable.Routes' in MVC 5? Questo sembra un bel po 'da passare solo per enumerare una lista di percorsi per un'applicazione; soprattutto perché le rotte sono facilmente aggiunte consecutivamente nel codice di avvio. –

+0

Ho paura che questa sia una domanda per il team di .NET. Questo è stato il metodo che mi è stato consigliato un anno fa. –

Problemi correlati