使用 Route 属性的端点触发不正确
Incorrect endpoint firing using Route attribute
我的 UserController 中有以下方法。前两个 Register
和 VerifyUser
工作正常。
但是 - 我无法调用登录。无论我尝试哪种 URL 组合 - Register
方法都会触发。
[RoutePrefix("api/user")]
public class UserController : ApiController
{
[Route("Register")]
[HttpPost]
public HttpResponseMessage Register([FromBody]RegisterUserModel model)
{
....
}
[HttpGet]
[Route("{email}/{verifyId}")]
public HttpResponseMessage VerifyUser(string email, string verifyId)
{
....
}
[Route("Login")] //Not being fired - Register being fired
[HttpPost]
public HttpResponseMessage Login([FromBody]RegisterUserModel userMod)
{
....
}
}
我是不是遗漏了什么明显的东西?
发生的情况是您很可能只有基于默认约定的路由
// Convention-based routing.
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
哪个会先映射到注册而不去检查Login
.
调用 api/user/Login
将映射到 api/{controller}/{id}
约定路由,而 Login
将映射到 id
占位符。路由 table 使用 HTTP 动词 POST 来查找可以使用提供的正文处理 post 的第一个操作。它会首先找到寄存器并映射到该操作。
检查以确保在 WebApiConfig
中启用了属性路由,即
// Attribute routing.
config.MapHttpAttributeRoutes();
// Convention-based routing.
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
下面的注释显示了映射到操作的 Url。
[RoutePrefix("api/user")]
public class UserController : ApiController {
//Matches POST api/user/register
[Route("Register")]
[HttpPost]
public IHttpActionResult Register([FromBody]RegisterUserModel model) {
//....
}
//Matches GET api/user/some_email/some_id
[HttpGet]
[Route("{email}/{verifyId}")]
public IHttpActionResult VerifyUser(string email, string verifyId) {
//....
}
//Matches POST api/user/login
[Route("Login")]
[HttpPost]
public IHttpActionResult Login([FromBody]RegisterUserModel userMod) {
//....
}
}
我的 UserController 中有以下方法。前两个 Register
和 VerifyUser
工作正常。
但是 - 我无法调用登录。无论我尝试哪种 URL 组合 - Register
方法都会触发。
[RoutePrefix("api/user")]
public class UserController : ApiController
{
[Route("Register")]
[HttpPost]
public HttpResponseMessage Register([FromBody]RegisterUserModel model)
{
....
}
[HttpGet]
[Route("{email}/{verifyId}")]
public HttpResponseMessage VerifyUser(string email, string verifyId)
{
....
}
[Route("Login")] //Not being fired - Register being fired
[HttpPost]
public HttpResponseMessage Login([FromBody]RegisterUserModel userMod)
{
....
}
}
我是不是遗漏了什么明显的东西?
发生的情况是您很可能只有基于默认约定的路由
// Convention-based routing.
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
哪个会先映射到注册而不去检查Login
.
调用 api/user/Login
将映射到 api/{controller}/{id}
约定路由,而 Login
将映射到 id
占位符。路由 table 使用 HTTP 动词 POST 来查找可以使用提供的正文处理 post 的第一个操作。它会首先找到寄存器并映射到该操作。
检查以确保在 WebApiConfig
中启用了属性路由,即
// Attribute routing.
config.MapHttpAttributeRoutes();
// Convention-based routing.
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
下面的注释显示了映射到操作的 Url。
[RoutePrefix("api/user")]
public class UserController : ApiController {
//Matches POST api/user/register
[Route("Register")]
[HttpPost]
public IHttpActionResult Register([FromBody]RegisterUserModel model) {
//....
}
//Matches GET api/user/some_email/some_id
[HttpGet]
[Route("{email}/{verifyId}")]
public IHttpActionResult VerifyUser(string email, string verifyId) {
//....
}
//Matches POST api/user/login
[Route("Login")]
[HttpPost]
public IHttpActionResult Login([FromBody]RegisterUserModel userMod) {
//....
}
}