使用 Route 属性的端点触发不正确

Incorrect endpoint firing using Route attribute

我的 UserController 中有以下方法。前两个 RegisterVerifyUser 工作正常。

但是 - 我无法调用登录。无论我尝试哪种 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) {
        //....
    }
}

引用Attribute Routing in ASP.NET Web API 2