2017-06-05 8 views
1

Web API 2のルーティング処理方法を理解する上で問題があります。私は、モデルを取るSave()呼ばPUTアクションでカスタムルートを追加しようとしたなどの標準的なアクションの観点からだけで正常に動作PostsControllerGETPOST.Net Web APIがルートと一致しない

  • を作成している

    • 引数。
    • カスタムルートの前に[HttpPut][Route("save")]を追加しました。また、WebAPIConfig.csにパターンを処理するように修正しましたapi/{controller}/{id}/{action}
    • しかし、郵便番号のhttp://localhost:58385/api/posts/2/savePUT)に行くと、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); 
    } 
    
  • +1

    'RouteDebugger' NuGetパッケージを使用し、それがどこで一致するルートを見つけるために見てなかった、ルーティングエンジンが探しているまさにルートを教えてくれますし、それはそれを見つけることができなかった理由。ルーティングエンジンは、いくつかの言葉で記述することはできません。言わなければならないことはたくさんあります。 – CodingYoshi

    答えて

    2

    あなたが設定する規則ベースのルーティングに並置などの属性が、ルーティングされ、その後[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);  
    } 
    

    リファレンスAttribute Routing in ASP.NET Web API 2

    +0

    属性ルーティングはすでに有効になっていましたが、回答に記載されているとおり、私はapiで始まる完全なパスを持っていませんでした。 –

    関連する問題