我的路线有什么问题

What's wrong with my routes

我在 webApiConfig 中声明了以下路线。

config.Routes.MapHttpRoute(
   name: "DefaultApiWithAction",
   routeTemplate: "api/{controller}/{action}/{id}",
   defaults: new { id = RouteParameter.Optional }
);

config.Routes.MapHttpRoute(
    name: "DefaultApi",
    routeTemplate: "api/{controller}/{id}",
    defaults: new { id = RouteParameter.Optional }
);

控制器上的路由属性如下:

[Route("users")]
public IHttpActionResult Get()


[Route("users/{id}")]
public IHttpActionResult Get(int id)

[AllowAnonymous]
[HttpPost]
[Route("users/validate")]
public IHttpActionResult Validate(string email)

当我打电话给:
~/api/users -- 有效
~/api/users/1 -- 有效
~/api/users/validate -- 失败...尝试进入 api/users/1 但由于 Post 动词而失败。

如何设置路由以便我可以在用户控制器中验证用户?

尝试使用属性路由来修饰validate方法:

http://www.asp.net/web-api/overview/web-api-routing-and-actions/attribute-routing-in-web-api-2

例如

[路线("customers/{customerId}/orders")]

public IEnumerable GetOrdersByCustomer(int customerId) { ... }

使用 Postman or Fiddler 测试 POST 操作,因为您无法使用浏览器执行此操作。

您不需要注册自定义路由,因为您已经拥有属性路由

从您的代码中删除 DefaultApiWithAction 路由。相反,您将需要 RoutePrefix.

[RoutePrefix("api/users")]
public class UsersController : ApiController
{
    public IHttpActionResult Get()
    {
        return Ok(new [] {"value1", "value2"});
    }

    public IHttpActionResult Get(int id)
    {
        return Ok(id);
    }

    [HttpPost]
    [Route("validate")]
    public IHttpActionResult Validate([FromBody]string email)
    {
        return Ok(email);
    }
}

如何测试 HttpPost

在 Chrome 浏览器中安装 Postman您还可以使用 Fiddler 或其他一些工具。

  1. Select POST 然后输入 URL http://localhost:XXXXX/api/users/validate
  2. Select application/json 作为内容类型
  3. 输入内容"johndoe@example.com"
  4. 点击发送后,您应该会看到结果

API 断点

您还没有启用Attribute Routing。您省略了 HttpConfiguration 上的 MapHttpAttributeRoutes

public static void Register(HttpConfiguration config)
{
    // Attribute routing.
    config.MapHttpAttributeRoutes();

    // Convention-based routing.
    config.Routes.MapHttpRoute(
       name: "DefaultApiWithAction",
       routeTemplate: "api/{controller}/{action}/{id}",
       defaults: new { id = RouteParameter.Optional }
    );

    config.Routes.MapHttpRoute(
        name: "DefaultApi",
        routeTemplate: "api/{controller}/{id}",
        defaults: new { id = RouteParameter.Optional }
    );
}

您还需要确保在 ApiController 上正确设置路由

[RoutePrefix("api/users")]
public class UsersController : ApiController {

    //GET api/users
    [HttpGet]
    [Route("")]
    public IHttpActionResult Get() { ... }

    //GET api/users/5    
    [HttpGet]    
    [Route("{id}")]
    public IHttpActionResult Get(int id) { ... }

    //POST api/users/validate?email=someone@email.com
    [AllowAnonymous]
    [HttpPost]
    [Route("validate")]
    public IHttpActionResult Validate(string email) { ... }

}