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

时间:2016-06-02 06:45:54

标签: asp.net asp.net-mvc asp.net-web-api asp.net-web-api-routing

我正在开发一个ASP.Net MVC应用程序。在我的项目中,我为移动设备提供REST api。但是我在Web Api中为我的其余api的URL配置路由时遇到问题。我正在使用Web Api 2和MVC 5.我的问题是有冲突的路由。即使我清楚地配置了请求,也无法选择正确的路由。请参阅下面的方案。

我有这样的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)
    {

    }
}

我在WebApiConfig中配置了这样的路由

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

发出请求时收到的错误

enter image description here

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

1 个答案:

答案 0 :(得分:1)

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

由于Web API和MVC是独立的框架,因此每个框架都有自己的控制器。 URL对于应用程序必须是唯一的,但它们之间不共享路由值。因此,您可以在两个框架中使用相同的路由值集(控制器和操作的名称相同),前提是您在它们中使用唯一的URL。通常,这是通过在Web Api URL前加/api(您已经完成)来完成的。但是,如果您在routeTemplate中添加了一个版本,则还必须在实际网址中使用该版本,否则您将无法访问控制器操作。