在ASP.NET Web API中重写或配置URL时发生冲突的路由
我正在开发一个ASP.NETMVC应用程序。在我的项目中,我为移动设备提供RESTAPI。但我在Web API中为rest API的URL配置路由时遇到问题。我正在使用WebAPI2和MVC5。我的问题是路线有冲突。请求无法选择正确的路由,即使我已清楚地配置了它 我有一个这样的会计控制器在ASP.NET Web API中重写或配置URL时发生冲突的路由,asp.net,asp.net-mvc,asp.net-web-api,asp.net-web-api-routing,Asp.net,Asp.net Mvc,Asp.net Web Api,Asp.net Web Api Routing,我正在开发一个ASP.NETMVC应用程序。在我的项目中,我为移动设备提供RESTAPI。但我在Web API中为rest API的URL配置路由时遇到问题。我正在使用WebAPI2和MVC5。我的问题是路线有冲突。请求无法选择正确的路由,即使我已清楚地配置了它 我有一个这样的会计控制器 [RoutePrefix("v1")] public class AccountController : ApiController { public UserManager<Applicatio
[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)
{
}
}
这些是我的模型课
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; }
}
这是我请求时遇到的错误
我的路线配置有什么问题?我如何修复它?您正在测试的URL
http://localhost:50489/api/account/login
与您提供的api/v1/account/login
路径的routeTemplate
不匹配,即URL中缺少v1
。您的测试显然正在到达另一条路径,这导致了此异常
由于WebAPI和MVC是独立的框架,因此它们都有自己的控制器。URL对于应用程序必须是唯一的,但它们之间不共享路由值。因此,您可以在两个框架中使用相同的路由值集(控制器和操作的名称相同),前提是在它们之间使用唯一的URL。通常,这是通过在Web Api URL前面加上
/Api
(您已经这样做了)来完成的。但是,如果您在routeTemplate
中放置了一个版本,您还必须在实际URL中使用它,否则您将无法访问控制器操作。这是您唯一一个名为AccountController(具有注册和登录方法)的控制器吗?如果没有,您可能需要以某种方式区分它们-例如,以不同的方式命名它们(例如,为您的WebAPI控制器使用ApiController后缀),或者在不同的范围(MVC的范围和WebAPI的范围)中引入它们。我已经有一段时间没有使用web API了。但是,有两种类型的路由。基于约定的vs属性路由。我相信,在您的场景中,必须使用属性路由。尝试将Route[“/register”]
和Route[“/login”]
放在相关方法之上,它应该会起作用。我添加了[Route(“login”)和[Route(“register”)]。但未找到与请求匹配的操作@当只有寄存器方法时,Muhammadadeelzahid。它起作用了。但当我添加登录操作时,它开始给我这个错误@MattstuvyStant您正在测试的URLhttp://localhost:50489/api/account/login
与您提供的api/v1/account/login
路径的routeTemplate
不匹配,即URL中缺少v1
。您的测试显然正在到达另一条路径,这导致了此异常。
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; }
}