属性ルーティングを使用すると、あいまいなルートの問題が発生します。問題は、ルートのルートで変数パラメーターを使用することから生じます (私は信じています)。私を悩ませているのは、リテラルパラメーターが優先されていないようで、MVC5 が使用するルートを決定できないことです。
以前に他のルートでこれに出くわしたことがあり、コンベンションルートを定義することで修正できたと思いました. それを念頭に置いて、属性ルーティングのベスト プラクティスとあいまいさの解決に関する詳細情報はどこで見つけることができますか?
これが私が問題を抱えているコードと例外です。
「/」アプリケーションでサーバー エラーが発生しました。
URL に一致する複数のコントローラ タイプが見つかりました。これは、複数のコントローラーの属性ルートが要求された URL と一致する場合に発生する可能性があります。
要求は、次の一致するコントローラー タイプを検出しました:
アカウントコントローラー
ラウンドコントローラー
説明: 現在の Web 要求の実行中に未処理の例外が発生しました。エラーの詳細とコード内のどこでエラーが発生したかについては、スタック トレースを確認してください。
例外の詳細: System.InvalidOperationException: URL に一致する複数のコントローラーの種類が見つかりました。これは、複数のコントローラーの属性ルートが要求された URL と一致する場合に発生する可能性があります。
要求は、次の一致するコントローラー タイプを検出しました:
アカウントコントローラー
ラウンドコントローラー
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)
{
}
}