MVC 路由冲突似乎很奇怪

MVC Route conflict seems strange

我正在使用 MVC 5.1 和 AutoFac。

我不明白为什么每个控制器的以下路由与此冲突URL:https://localhost:44300/Home/login

我认为它会映射到第一种方法。我得到这个错误:

找到多个与 URL 匹配的控制器类型。如果多个控制器上的属性路由与请求的 URL.

相匹配,就会发生这种情况

请求已找到以下匹配的控制器类型: AllThings.WebUI.Controllers.AccountController AllThings.WebUI.Controllers.PostController


    public class AccountController : Controller
{
    //
    // GET: /Account/Login
    [Route("~/{site}/Login")]
    [Route("~/Account/Login")]
    [Route("~/{country:maxlength(2)}/{site}/Login")]
    [Route("~/{country:maxlength(2)}/Account/Login")]
    [AllowAnonymous]
    public ActionResult Login(string returnUrl, string country, string site)
    {
        return View();
    }
}


    public class PostController : Controller
{
    [Route("~/{site}/{CategoryUrl?}")]
    [Route("~/{country:maxlength(2)}/{site}/{CategoryUrl?}", Name = "ResultList")]
    [AllowAnonymous]
    public ActionResult List(string country, string site, SearchCriteriaViewModel searchCriteriaViewModel)
    {
        return View("List", searchCriteriaViewModel);
    }
}

主要问题是您有 3 条可能的路线可以匹配 /Home/Login

[Route("~/{site}/Login")]
[Route("~/Account/Login")]
[Route("~/{site}/{CategoryUrl?}")]

自由使用占位符,尤其是 URL 模板定义中的所有占位符并不是一件好事。你应该在 URL 中使用文字,或者如果你使用占位符,它们应该有约束,这样它们就不会冲突。

请注意,以下路线也会发生冲突:

[Route("~/{country:maxlength(2)}/{site}/Login")]
[Route("~/{country:maxlength(2)}/Account/Login")]
[Route("~/{country:maxlength(2)}/{site}/{CategoryUrl?}", Name = "ResultList")]

他们中的任何一个都可以匹配 UK/Account/Login

此外,使用波浪号 (~) 是为了覆盖路由前缀(参见 MSDN documentation)。如果您的控制器没有定义,您应该从第一个段或占位符开始。