我正在开发一个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
发出请求时收到的错误我的路线配置有什么问题?我该如何解决这个问题?
答案 0 :(得分:1)
您正在测试的网址http://localhost:50489/api/account/login
与您提供的路由的routeTemplate
api/v1/account/login
不匹配,即您在网址中缺少v1
。您的测试显然已到达另一条路线,导致此异常。
由于Web API和MVC是独立的框架,因此每个框架都有自己的控制器。 URL对于应用程序必须是唯一的,但它们之间不共享路由值。因此,您可以在两个框架中使用相同的路由值集(控制器和操作的名称相同),前提是您在它们中使用唯一的URL。通常,这是通过在Web Api URL前加/api
(您已经完成)来完成的。但是,如果您在routeTemplate
中添加了一个版本,则还必须在实际网址中使用该版本,否则您将无法访问控制器操作。