Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# .Net Web API不支持';不匹配路线_C#_Asp.net Web Api_Asp.net Web Api Routing - Fatal编程技术网

C# .Net Web API不支持';不匹配路线

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

我在理解WebAPI2如何处理路由时遇到了一些问题

  • 我已经创建了一个
    PostsController
    ,它在标准操作、
    GET
    POST
    等方面运行良好
  • 我尝试添加一个自定义路由,该路由是一个名为
    Save()
    PUT
    操作,它将模型作为参数
  • 我在自定义路由前面添加了
    [HttpPut]
    [Route(“save”)]
    。我还修改了WebAPIConfig.cs来处理模式
    api/{controller}/{id}/{action}
  • 但是,如果我转到
    http://localhost:58385/api/posts/2/save
    在Postman中(使用
    PUT
    ),我收到一条错误消息,大意是
    在控制器“Posts”上找不到与名称“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);    
}

参考

使用
RouteDebugger
NuGet包,它将准确地告诉您路由引擎正在查找的路由,它在哪里查找匹配的路由以及为什么找不到它。路由引擎不能用几句话来描述。有很多话要说。属性路由已经启用,但正如您在回答中所述,我没有从api开始的完整路径。