我的路线有什么问题
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) { ... }
您不需要注册自定义路由,因为您已经拥有属性路由。
从您的代码中删除 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 或其他一些工具。
- Select POST 然后输入 URL
http://localhost:XXXXX/api/users/validate
- Select
application/json
作为内容类型
- 输入内容
"johndoe@example.com"
- 点击发送后,您应该会看到结果
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) { ... }
}
我在 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) { ... }
您不需要注册自定义路由,因为您已经拥有属性路由。
从您的代码中删除 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 或其他一些工具。
- Select POST 然后输入 URL
http://localhost:XXXXX/api/users/validate
- Select
application/json
作为内容类型 - 输入内容
"johndoe@example.com"
- 点击发送后,您应该会看到结果
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) { ... }
}