Неоднозначные маршруты с атрибутом маршрутизации 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)
{
}
}
452   2  

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

    Ничего не найдено.