在ASP.NET Core中,有没有办法查看Startup中定义的所有路由的列表?我们使用IRouteBuilder的MapRoute扩展方法来定义路由.
我们正在迁移一个较旧的项目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 = ??? } }
解决方法
要获取所有路由,您需要使用MVC的ApiExplorer部分.您可以使用属性标记所有操作,也可以使用像这样的约定:
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>(); } }