URL 重写或配置 ASP.NET Web API 中的路由存在冲突

Routes having conflict in URL rewriting or configuring route in ASP.NET Web API

我正在开发 ASP.Net MVC 应用程序。在我的项目中,我为移动设备提供 REST API。但是我在为 Web Api 中的其他 API 的 URL 配置路由时遇到问题。我正在使用 Web Api 2 和 MVC 5。我的问题是路由有冲突。我配置清楚了request还是不能选择正确的路由

我有这样的 AccountController。

[RoutePrefix("v1")]
public class AccountController : ApiController
{
    public UserManager<ApplicationUser> UserManager { get; private set; }

    [HttpPost]
    public async Task<IHttpActionResult> Register(RegisterBM model)
    {

    }

    [HttpPost]
    public IHttpActionResult Login(LoginBM model)
    {

    }
}

我在 Web 中配置了路由Api像这样配置

config.Routes.MapHttpRoute(
    name: "",
    routeTemplate: "api/v1/account/register",
    defaults: new { controller = "Account", action = "Register" ,model = RouteParameter.Optional }
);

config.Routes.MapHttpRoute(
    name: "",
    routeTemplate: "api/v1/account/login",
    defaults: new { controller = "Account", action = "Login", model = RouteParameter.Optional }
);

这些是我的模型类

public class LoginBM
{
    [Required]
    [EmailAddress]
    public string Email { get; set; }
    [Required]
    public string Password { get; set; }
}

public class RegisterBM
{
    [Required]
    public string Name { get; set; }
    [Required]
    [EmailAddress]
    [MaxLength(70)]
    [UniqueAccountEmail(ErrorMessage = "Email is alreay taken")]
    public string Email { get; set; }
    [Required]
    [StringLength(100, ErrorMessage = "The {0} must be at least {2} characters long.", MinimumLength = 6)]
    public string Password { get; set; }
    [Compare("Password", ErrorMessage = "The password and confirmation password do not match.")]
    public string ConfirmPassword { get; set; }
}

这是我向 http://localhost:50489/api/account/login

发出请求时遇到的错误

我的路由配置有什么问题?我该如何解决?

您正在测试的 URL http://localhost:50489/api/account/login 与您提供的路由 routeTemplate 不匹配 api/v1/account/login,即您缺少 v1 URL。您的测试显然到达了另一条路线,这导致了此异常。

由于 Web API 和 MVC 是独立的框架,每个框架都有自己的控制器。 URLs 对于应用程序必须是唯一的,但它们之间不共享路由值。因此,您可以在两个框架中使用相同的一组路由值(控制器和操作的名称相同),前提是您在它们之间使用唯一的 URLs。通常,这是通过在 Web Api URL 前加上 /api 前缀来完成的(您已经这样做了)。但是如果你在routeTemplate里放了一个版本,你必须在实际URL里也使用它,否则你将达不到控制器的动作。