2015-02-10 17 views
12

В ASP.NET Core, есть ли способ увидеть список всех маршрутов, определенных в Startup? Для определения маршрутов мы используем метод расширения MapRouteIRouteBuilder.Получить список всех маршрутов

Мы переносим старый проект WebAPI проекта. Там мы могли бы использовать GlobalConfiguration.Configuration.Routes, чтобы получить все маршруты.

В частности, мы делаем это в рамках фильтра действий.

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

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

     // var allRoutes = ??? 
    } 
} 

ответ

2

Вы можете получить HttpRouteCollection из HttpActionContext через:

actionContext.RequestContext.Configuration.Routes 

RequestContext

HttpConfiguration

HttpRouteCollection

- После того, как вопрос обновления -

ActionExecutingContext имеет свойство RouteData, которое он наследует от ControllerContext, который предоставляет свойство DataTokens (которое является словарем значения маршрута). Вероятно, это не тот же набор вы привыкли работать, но он обеспечивает доступ к этой коллекции:

actionContext.RouteData.DataTokens 

DataTokens

+0

ОК - это пустой словарь в моем случае. И RouteData, как представляется, содержит данные, относящиеся к текущему маршруту, а не список всех маршрутов. – clhereistian

+0

'actionContext.RequestContext.Configuration.Routes' больше не существует. –

14

Чтобы получить на всех маршрутах, вам нужно использовать ApiExplorer часть от MVC. Вы можете пометить все свои действия с атрибутом или использовать конвенции как этот:

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

В Startup.cs, добавьте ваш новый в ConfigureServices(...)

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

В вашем ActionFilter вы можете использовать конструктор инъекции, чтобы получить 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, который имеет RelativePath, который является шаблон маршрута для этого маршрут:

// 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

Жаль, что я не смог бы поддержать это 100 раз. Так сложно найти документы об ApiExplorer в AspNetCore, и образцы на github от Microsoft устарели. Спасибо! – rrreee

+0

Просто для ясности, это также замена для использования глобального 'RouteTable.Routes' в MVC 5? Это кажется очень сложным, чтобы перечислить список маршрутов для приложения; тем более, что маршруты легко добавляются последовательно в код запуска. –

+0

Я боюсь, что это вопрос для команды .NET. Это был метод, рекомендованный мне год назад. –

Смежные вопросы