Сопоставьте все маршруты, которые начинаются с определенной части URL/ключевого слова

Я создаю тестовый центр для различных модульных тестов в своей личной библиотеке, и я хотел иметь легкий доступ к тестовому API. Итак, у меня есть две записи в моей конфигурации маршрута: по умолчанию и мой собственный маршрут...

routes.MapRoute(
            name:="Default",
            url:="{controller} / {Action} / {id}",
            defaults:=New With {.controller = "Home", .action = "Index", .id = UrlParameter.Optional}
        )

        routes.MapHttpRoute(
                name:="UnitTests",
                routeTemplate:="test/{category}/{testname}",
                defaults:=New With {.controller = "TestApis", .action = "testme",
                .category = "TestCategoryOne", .testname = UrlParameter.Optional}
            )

Идея заключалась в том, что всякий раз, когда я хочу сделать вызов моему тестовому API-контроллеру, я просто добавляю URL-адрес с «test/», и он будет знать, что нужно перенаправить его на мой «TestApisController». . . но, похоже, мой маршрут по умолчанию нарушился.

ВОПРОС

Есть ли способ, с помощью которого я могу сопоставить все маршруты, начинающиеся с «test/», с определенным контроллером, в то же время не нарушая мой маршрут по умолчанию?

РЕДАКТИРОВАТЬ

Итак, через некоторое время я понял, что причина, по которой этот метод не работает, не имеет ничего общего с маршрутом. У меня был другой маршрут API по умолчанию, определенный в файле «WebApiConfig», который вызывал некоторые проблемы. Прошу прощения, я все еще перехожу с Webforms на MVC.


person Lopsided    schedule 04.10.2015    source источник
comment
Я немного запутался, MapHttpRoute не существует в MVC 6? Самое близкое, что я знаю, это добавление Microsoft.AspNet.Mvc.WebApiCompatShim, которое позволяет вам использовать routes.MapWebApiRoute. В любом случае, почему бы вам не добавить свой маршрут в качестве стандартного маршрута (поскольку вы определяете контроллер и действие) с помощью routes.MapRoute и объявить его перед маршрутом по умолчанию (поскольку тестовый маршрут более специфичен, чем маршрут по умолчанию) ?   -  person Daniel J.G.    schedule 07.10.2015
comment
@DanielJ.G. Я использую MapHttpRoute, потому что контроллер, который я пытаюсь вызвать, является контроллером веб-API. Кажется, иначе это не работает.   -  person Lopsided    schedule 08.10.2015
comment
@DanielJ.G. И это была моя ошибка в отношении тега MVC 6. Я использую MVC версии 5.2.   -  person Lopsided    schedule 08.10.2015
comment
Вам нужно будет поменять местами порядок маршрутов ../test/someCategory/someTestName перейдет к методу someCategory testController передачи someTestName параметру id, поскольку он соответствует первому (по умолчанию) маршруту   -  person    schedule 08.10.2015


Ответы (1)


Поскольку контроллер, к которому вы пытаетесь выполнить маршрутизацию, является контроллером веб-API, вам нужно поместить свой собственный маршрут в файл WebApiConfig.vb. Затем маршрут должен идти выше маршрута по умолчанию в этом файле, потому что он более конкретен, чем маршрут по умолчанию, как отметил @Stephen Muecke. Ваш исходный код немного изменится, вместо routes.MapHttpRoute у вас будет config.Routes.MapHttpRoute, например:

config.Routes.MapHttpRoute( _
    name:="UnitTests", _
    routeTemplate:="test/{category}/{testname}", _
    defaults:=New With {.controller = "TestApis", .action = "testme", .category = "TestCategoryOne", .testname = UrlParameter.Optional}
)

Я сделал то же самое, когда хотел в некоторых ситуациях направить на определенные контроллеры, а также включил в маршрут настраиваемые обработчики аутентификации, то, что вы пытаетесь сделать, должно работать.

person AK3800    schedule 21.01.2016