我的路线出了什么问题

时间:2016-07-24 16:35:57

标签: c# asp.net-web-api2 asp.net-mvc-routing

我在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动词而失败。

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

4 个答案:

答案 0 :(得分:0)

尝试使用use属性routing来修饰validate方法:

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

E.g

〔路线("客户/ {客户ID} /订单&#34)]

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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

从代码中删除 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. 选择POST并输入网址http://localhost:XXXXX/api/users/validate
  2. 选择application/json作为内容类型
  3. 输入内容"johndoe@example.com"
  4. 点击发送后,您会看到结果
  5. enter image description here

    API断点

    enter image description here

答案 3 :(得分:0)

您尚未启用Attribute Routing。您已在MapHttpAttributeRoutes上省略了HttpConfiguration

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) { ... }

}