From 232a19d7dfe0e3847b3a9a9a9be83485ffb9031c Mon Sep 17 00:00:00 2001 From: crupest Date: Sat, 30 May 2020 16:23:25 +0800 Subject: Merge front end to this repo. But I need to wait for aspnet core support for custom port and package manager for dev server. --- Timeline/Routes/ApiRoutePrefixConvention.cs | 45 +++++++++++++++++++++++++++++ 1 file changed, 45 insertions(+) create mode 100644 Timeline/Routes/ApiRoutePrefixConvention.cs (limited to 'Timeline/Routes/ApiRoutePrefixConvention.cs') diff --git a/Timeline/Routes/ApiRoutePrefixConvention.cs b/Timeline/Routes/ApiRoutePrefixConvention.cs new file mode 100644 index 00000000..2653c2ca --- /dev/null +++ b/Timeline/Routes/ApiRoutePrefixConvention.cs @@ -0,0 +1,45 @@ +using Microsoft.AspNetCore.Mvc; +using Microsoft.AspNetCore.Mvc.ApplicationModels; +using Microsoft.AspNetCore.Mvc.Routing; +using System.Linq; + +namespace Timeline.Routes +{ + public static class MvcOptionsExtensions + { + public static void UseApiRoutePrefix(this MvcOptions opts, IRouteTemplateProvider routeAttribute) + { + opts.Conventions.Add(new ApiRoutePrefixConvention(routeAttribute)); + } + + public static void UseApiRoutePrefix(this MvcOptions opts, string prefix) + { + opts.UseApiRoutePrefix(new RouteAttribute(prefix)); + } + } + + public class ApiRoutePrefixConvention : IApplicationModelConvention + { + private readonly AttributeRouteModel _routePrefix; + + public ApiRoutePrefixConvention(IRouteTemplateProvider route) + { + _routePrefix = new AttributeRouteModel(route); + } + + public void Apply(ApplicationModel application) + { + foreach (var selector in application.Controllers.Where(c => c.RouteValues.TryGetValue("area", out var value) && value == "api").SelectMany(c => c.Selectors)) + { + if (selector.AttributeRouteModel != null) + { + selector.AttributeRouteModel = AttributeRouteModel.CombineAttributeRouteModel(_routePrefix, selector.AttributeRouteModel); + } + else + { + selector.AttributeRouteModel = _routePrefix; + } + } + } + } +} -- cgit v1.2.3