.Net Web API 不匹配路由
.Net Web API Doesn't Match Route
我无法理解 Web API 2 如何处理路由。
- 我创建了一个
PostsController
,它在标准操作 GET
、POST
等方面运行良好
- 我尝试添加一个自定义路由,它是一个名为
Save()
的 PUT
操作,它采用模型作为参数。
- 我在自定义路由前面加了
[HttpPut]
和[Route("save")]
。我还修改了 WebAPIConfig.cs 来处理模式 api/{controller}/{id}/{action}
- 但是,如果我在 Postman 中转到
http://localhost:58385/api/posts/2/save
(使用 PUT
),我会收到一条类似于 No action was found on the controller 'Posts' that matches the name 'save'
的错误消息。本质上是一个美化的 404.
- 如果我将路线更改为
[Route("{id}/save")]
,结果错误仍然存在。
我做错了什么?
WebAPIConfig.cs
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}/{action}",
defaults: new { id = RouteParameter.Optional, action = RouteParameter.Optional, }
);
PostController.cs
// GET: api/Posts
public IHttpActionResult Get()
{
PostsStore store = new PostsStore();
var AsyncResult = store.GetPosts();
return Ok(AsyncResult);
}
// GET: api/Posts/5
public IHttpActionResult Get(string slug)
{
PostsStore store = new PostsStore();
var AsyncResult = store.GetBySlug(slug);
return Ok(AsyncResult);
}
// POST: api/Posts
public IHttpActionResult Post(Post post)
{
PostsStore store = new PostsStore();
ResponseResult AsyncResult = store.Create(post);
return Ok(AsyncResult);
}
// PUT: api/Posts/5 DELETED to make sure I wasn't hitting some sort of precedent issue.
//public IHttpActionResult Put(Post post)
// {
// return Ok();
//}
[HttpPut]
[Route("save")]
public IHttpActionResult Save(Post post)
{
PostsStore store = new PostsStore();
ResponseResult AsyncResponse = store.Save(post);
return Ok(AsyncResponse);
}
如果使用 [Route]
属性,那么这是属性路由,与您配置的基于约定的路由相对。您还需要启用属性路由。
//WebAPIConfig.cs
// enable attribute routing
config.MapHttpAttributeRoutes();
//...add other convention-based routes
而且路由模板也必须正确设置。
//PostController.cs
[HttpPut]
[Route("api/posts/{id}/save")] // Matches PUT api/posts/2/save
public IHttpActionResult Save(int id, [FromBody]Post post) {
PostsStore store = new PostsStore();
ResponseResult AsyncResponse = store.Save(post);
return Ok(AsyncResponse);
}
我无法理解 Web API 2 如何处理路由。
- 我创建了一个
PostsController
,它在标准操作GET
、POST
等方面运行良好 - 我尝试添加一个自定义路由,它是一个名为
Save()
的PUT
操作,它采用模型作为参数。 - 我在自定义路由前面加了
[HttpPut]
和[Route("save")]
。我还修改了 WebAPIConfig.cs 来处理模式api/{controller}/{id}/{action}
- 但是,如果我在 Postman 中转到
http://localhost:58385/api/posts/2/save
(使用PUT
),我会收到一条类似于No action was found on the controller 'Posts' that matches the name 'save'
的错误消息。本质上是一个美化的 404. - 如果我将路线更改为
[Route("{id}/save")]
,结果错误仍然存在。
我做错了什么?
WebAPIConfig.cs
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}/{action}",
defaults: new { id = RouteParameter.Optional, action = RouteParameter.Optional, }
);
PostController.cs
// GET: api/Posts
public IHttpActionResult Get()
{
PostsStore store = new PostsStore();
var AsyncResult = store.GetPosts();
return Ok(AsyncResult);
}
// GET: api/Posts/5
public IHttpActionResult Get(string slug)
{
PostsStore store = new PostsStore();
var AsyncResult = store.GetBySlug(slug);
return Ok(AsyncResult);
}
// POST: api/Posts
public IHttpActionResult Post(Post post)
{
PostsStore store = new PostsStore();
ResponseResult AsyncResult = store.Create(post);
return Ok(AsyncResult);
}
// PUT: api/Posts/5 DELETED to make sure I wasn't hitting some sort of precedent issue.
//public IHttpActionResult Put(Post post)
// {
// return Ok();
//}
[HttpPut]
[Route("save")]
public IHttpActionResult Save(Post post)
{
PostsStore store = new PostsStore();
ResponseResult AsyncResponse = store.Save(post);
return Ok(AsyncResponse);
}
如果使用 [Route]
属性,那么这是属性路由,与您配置的基于约定的路由相对。您还需要启用属性路由。
//WebAPIConfig.cs
// enable attribute routing
config.MapHttpAttributeRoutes();
//...add other convention-based routes
而且路由模板也必须正确设置。
//PostController.cs
[HttpPut]
[Route("api/posts/{id}/save")] // Matches PUT api/posts/2/save
public IHttpActionResult Save(int id, [FromBody]Post post) {
PostsStore store = new PostsStore();
ResponseResult AsyncResponse = store.Save(post);
return Ok(AsyncResponse);
}