C# .Net Web API不支持';不匹配路线
我在理解WebAPI2如何处理路由时遇到了一些问题C# .Net Web API不支持';不匹配路线,c#,asp.net-web-api,asp.net-web-api-routing,C#,Asp.net Web Api,Asp.net Web Api Routing,我在理解WebAPI2如何处理路由时遇到了一些问题 我已经创建了一个PostsController,它在标准操作、GET、POST等方面运行良好 我尝试添加一个自定义路由,该路由是一个名为Save()的PUT操作,它将模型作为参数 我在自定义路由前面添加了[HttpPut]和[Route(“save”)]。我还修改了WebAPIConfig.cs来处理模式api/{controller}/{id}/{action} 但是,如果我转到http://localhost:58385/api/post
- 我已经创建了一个
,它在标准操作、PostsController
、GET
等方面运行良好POST
- 我尝试添加一个自定义路由,该路由是一个名为
的Save()
操作,它将模型作为参数PUT
- 我在自定义路由前面添加了
和[HttpPut]
。我还修改了WebAPIConfig.cs来处理模式[Route(“save”)]
api/{controller}/{id}/{action}
- 但是,如果我转到
在Postman中(使用http://localhost:58385/api/posts/2/save
),我收到一条错误消息,大意是PUT
。基本上是一个光荣的404在控制器“Posts”上找不到与名称“save”匹配的操作。
- 如果我将路由更改为
,则产生的错误仍然存在[route({id}/save”)]
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);
}
参考使用
RouteDebugger
NuGet包,它将准确地告诉您路由引擎正在查找的路由,它在哪里查找匹配的路由以及为什么找不到它。路由引擎不能用几句话来描述。有很多话要说。属性路由已经启用,但正如您在回答中所述,我没有从api开始的完整路径。