Как вы упомянули, параметр catch-all может появляться только в конце маршрута - код, который вы опубликовали, вызовет ошибку во время выполнения и даст вам желтый экран смерти, если вы даже попытаетесь запустить ваше приложение.
Существует несколько точек расширяемости для создания пользовательских маршрутных сценариев. Это - Route, RouteBase и IRouteHandler.
Вы можете создать сгенерированный список маршрутов для обработки, расширив RouteBase. Как правило, вы должны следовать шаблону наличия конструктора, который принимает ресурс (имя контроллера), а затем присваивает ему список маршрутов, за которые он отвечает, а затем сопоставляет его в вашем global.asax. Вот несколько примеров кода вы можете создать из:
public class MyRoute : RouteBase
{
private List<Route> _routes = new List<Route>();
public MyRoute(string resource)
{
// make a Resource property, not shown in this example
this.Resource = resource;
// Generate all your routes here
_routes.Add(
new Route("some/url/{param1}",
new McvRouteHandler {
Defaults = new RouteValueDictionary(new {
controller = resource,
action = actionName
}),
Constraints = new RouteValueDictionary()
);
_routes.Add(...); // another new route
}
public override RouteData GetRouteData(HttpContextBase context)
{
foreach (var route in _routes)
{
var data = route.GetRouteData(context);
if (data != null)
{
return data;
}
}
return null;
}
public override VirtualPathData GetVirtualPath(RequestContext context, RouteValueDictionary rvd)
{
foreach (var route in _routes)
{
var path = route.GetVirtualPath(context, rvd);
if (path != null)
{
return path;
}
}
return null;
}
}
Чтобы использовать класс маршрутизации, сделать routes.Add(new MyRoute("page1"));
в вашем Global.asax.
Если вам нужен еще больший контроль, вы можете реализовать IRouteHandler, и вместо создания MvcRouteHandlers() для ваших маршрутов, как показано в приведенном выше примере, используйте свой собственный IRouteHandler. Это позволит вам переопределить логику выбора контроллера из данных запроса.
Весь каркас чрезвычайно расширяемый, но вам нужно будет изучить немного, чтобы сделать это правильно. Я бы предложил просто переставить URL-адрес, если это возможно, чтобы воспользоваться опцией catch-all, если сможете.
Elastic.Routing (https://github.com/lokiworld/Elastic.Routing) расширяет встроенную маршрутизацию MVC и предоставляет вам возможность использовать улов на любом сегменте вашего маршрута, а также некоторые другие полезные такие как необязательные сегменты. – BrutalDev