全局路由設置
app.UseMvc(routes => { routes.MapRoute( name: "areas", template: "{area:exists}/{controller=Login}/{action=Index}/{id?}"); routes.MapRoute( name: "default", template: "{controller=Login}/{action=Index}/{id?}"); });
區域路由控制器上加
[Area("FrontDesk")] public class LoginController : Controller { // GET: /<controller>/ public IActionResult Index() { return View(); } }
API路由
[Route("api/[controller]/[action]")] [ApiController] public class SysLogController : Controller { }
自己定義中間件定義路由參考
博客地址:https://blog.csdn.net/KingCruel/article/details/89228952
中間件定義
using Microsoft.AspNetCore.Mvc.ApplicationModels; using Microsoft.AspNetCore.Mvc.Routing; using System.Linq; namespace Web.Api.Intercept { /// <summary> /// api 路由攔截器(第一步) /// </summary> public class RouteConvention : IApplicationModelConvention { private readonly AttributeRouteModel _centralPrefix; public RouteConvention(IRouteTemplateProvider routeTemplateProvider) { _centralPrefix = new AttributeRouteModel(routeTemplateProvider); } //接口的Apply方法 public void Apply(ApplicationModel application) { //遍歷所有的 Controller foreach (var controller in application.Controllers) { // 已經標記了 RouteAttribute 的 Controller var matchedSelectors = controller.Selectors.Where(x => x.AttributeRouteModel != null).ToList(); if (matchedSelectors.Any()) { foreach (var selectorModel in matchedSelectors) { // 在 當前路由上 再 添加一個 路由前綴 selectorModel.AttributeRouteModel = AttributeRouteModel.CombineAttributeRouteModel(_centralPrefix, selectorModel.AttributeRouteModel); } } // 沒有標記 RouteAttribute 的 Controller var unmatchedSelectors = controller.Selectors.Where(x => x.AttributeRouteModel == null).ToList(); if (unmatchedSelectors.Any()) { foreach (var selectorModel in unmatchedSelectors) { // 添加一個 路由前綴 selectorModel.AttributeRouteModel = _centralPrefix; } } } } } }
using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc.Routing; namespace Web.Api.Intercept { /// <summary> /// api 路由攔截器(第二步) /// 擴展了MVCoptions /// </summary> public static class MvcOptionsExtensions { /// <summary> /// 擴展方法 /// </summary> /// <param name="opts"></param> /// <param name="routeAttribute">自定的前綴內容</param> public static void UseCentralRoutePrefix(this MvcOptions opts, IRouteTemplateProvider routeAttribute) { // 添加我們自定義 實現IApplicationModelConvention的RouteConvention opts.Conventions.Insert(0, new RouteConvention(routeAttribute)); } } }
使用
public void ConfigureServices(IServiceCollection services) { services.AddMvcCore() .AddAuthorization() .AddJsonFormatters(); //默認 //services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2); services.AddMvc(opt => { #region 配置全局路由(第三步) //在各個控制器添加前綴(沒有特定的路由前面添加前綴) opt.UseCentralRoutePrefix(new RouteAttribute("lg/v1/[action]")); //opt.UseCentralRoutePrefix(new RouteAttribute("api/[controller]/[action]")); #endregion }).SetCompatibilityVersion(CompatibilityVersion.Version_2_2); }