Неоднозначные маршруты с атрибутом маршрутизации MVC5
У меня возникла проблема с неоднозначными маршрутами при использовании атрибутивной маршрутизации. Проблемы возникают из-за (Я полагаю) использования переменных параметров в корне наших маршрутов. Что меня раздражает, так это то, что литеральные параметры, похоже, не имеют приоритета, и MVC5 не может определить, какой маршрут использовать.
Я сталкивался с этим раньше с другими маршрутами и думал, что мне удалось исправить, определив маршрут конвенции. Имея это в виду, где я могу найти дополнительную информацию о лучших практиках для атрибута маршрутизация и разрешение неоднозначностей?
Вот код, с которым у меня возникли проблемы, а также исключение.
Ошибка сервера в приложении'/'.
Было найдено несколько типов контроллеров, которые соответствуют URL. Это может произойти, если маршруты атрибутов на нескольких контроллерах совпадают с запрошенным URL.
Запрос нашел следующие соответствующие типы контроллеров:
AccountController
RoundController
Описание : необработанное исключение возникло во время выполнения текущего веб-запроса. Пожалуйста, просмотрите трассировку стека для получения дополнительной информации об ошибке и о том, где она возникла в коде.
Детали Исключения : Система.InvalidOperationException: найдено несколько типов контроллеров, соответствующих URL. Это может произойти, если маршруты атрибутов на нескольких контроллерах совпадают с запрошенным URL.
Запрос нашел следующее соответствие типы контроллеров:
AccountController
RoundController
RouteConfig.cs
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
// I added this constraint resolver to resolve some other ambiguous routes that end
// with a literal, but MVC5 wasn't able to determine whether to use those routes
var constraintResolver = new System.Web.Mvc.Routing.DefaultInlineConstraintResolver();
constraintResolver.ConstraintMap.Add("notWriteAction", typeof(IsNotWriteActionConstraint));
routes.MapMvcAttributeRoutes(constraintResolver);
// This is the convention route I added to resolve another ambiguous route.
routes.MapRoute(
name: "Account",
url: "Account/{action}/{GroupName}/{AccessToken}",
defaults: new { controller = "Account", action = "Login", GroupName = UrlParameter.Optional, AccessToken = UrlParameter.Optional }
);
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
}
RoundController.cs
public class RoundController : ControllerBase
{
[Route("{groupid}/{campaignid}/{accesstoken}")]
public async Task<ActionResult> TempRoundLink(string groupid, string campaignid, string accesstoken)
{
}
}
AccountController.cs
public class AccountController : ControllerBase
{
[AllowAnonymous]
[Route("Account/ResetPassword/{token}")]
public async Task<ActionResult> ResetPassword(string token)
{
}
}
2 ответов:
Я знаю, что это не совсем то, о чем вы спрашиваете, но я думаю, что это можно исправить с помощью атрибута
RoutePrefix. Например,Я думаю, что причина, по которой он пытается не делать предположения, заключается в том, что предпочтение не всегда может быть установлено. Например, как бы вы ожидали, что маршрутизатор вычислит эти два:[RoutePrefix("Round")] public class RoundController : ControllerBase { [Route("{groupid}/{campaignid}/{accesstoken}")] public async Task<ActionResult> TempRoundLink(string groupid, string campaignid, string accesstoken) { } } [RoutePrefix("Account")] public class AccountController : ControllerBase { [AllowAnonymous] [Route("Account/ResetPassword/{token}")] public async Task<ActionResult> ResetPassword(string token) { } }Routes (from attributes): "Account/ResetPassword/{token}" "Account/{something}/alpha" Reequest: "/Account/ResetPassword/alpha"Но это только предположение...
Я намеревался написать что-нибудь более длинное, чем это, но у меня не было времени. Решение, которое я выбрал, состояло в том, чтобы исключить любые вызовы библиотеки маршрутизации атрибутов Microsoft и вместо этого использовать пакет "маршрутизация атрибутов", найденный здесь. http://htmlpreview.github.io/?https://github.com/mccalltd/AttributeRouting/blob/gh-pages/index.html
Это работает очень хорошо, и свойства приоритета * решают точную проблему, которая была у меня в оригинале вопрос.
Comments