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里也使用它,否则你将达不到控制器的动作。
我正在开发 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里也使用它,否则你将达不到控制器的动作。