0

コントローラーに属性ルーティングを適用しましたが、間違った操作にルーティングされています。私はどこが間違っているのか分かりません。ASP.NET Web APIの属性が正しく処理されていません。

using System.Collections.Generic; 
using System.Web.Http; 
using System.Web.Http.Description; 
using System.Linq; 
using System; 

namespace Iboo.API.Controllers 
{ 
    public class ClientsController : ApiController 
    { 
     private readonly IClientRepository _repository; 

     public ClientsController(IClientRepository repository) 
     { 
      _repository = repository; 
     } 

     // GET: api/Clients 
     [Route("api/v1/clients")] 
     public IEnumerable<Client> Get() 
     { 

      //code 
     } 


     // GET: api/Clients/5 
     [HttpGet] 
     [ResponseType(typeof(Client))] 
     [Route("api/v1/clients/get/{id}")] 
     public IHttpActionResult GetClientById(int id) 
     { 
      //code 
     } 

     // GET: api/Clients/5 
     [HttpGet] 
     [ResponseType(typeof(string))] 
     [Route("api/v1/clients/{id}/emailid")] 
     public IHttpActionResult GetClientEmailId(int id) 
     { 
      //code 
     }   
    } 
} 

私はGetClientEmailId方法で特に興味を持っています:

は、ここに私のコントローラです。私は私が欲しいものではありませんどのhttp://localhost:54919/api/v1/clientsに私を取っているhttp://localhost:54919/api/v1/clients/?id=1/getemailidを入力した場合、ブラウザでは

public class WebApiApplication : System.Web.HttpApplication 
{ 
    protected void Application_Start() 
    { 
     AreaRegistration.RegisterAllAreas(); 
     GlobalConfiguration.Configure(WebApiConfig.Register); 
     FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters); 
     RouteConfig.RegisterRoutes(RouteTable.Routes); 
     BundleConfig.RegisterBundles(BundleTable.Bundles); 
    } 
} 

を次のように以下の私のWebApiConfigある

public static void Register(HttpConfiguration config) 
{ 
    // Web API configuration and services 
    var container = new UnityContainer(); 
    container.RegisterType<IClientRepository, ClientRepository>(new 
    HierarchicalLifetimeManager()); 


    // Web API routes 
    config.MapHttpAttributeRoutes(); 

    config.Routes.MapHttpRoute(
     name: "DefaultApi", 
     routeTemplate: "api/v1/{controller}/{id}", 
     defaults: new { id = RouteParameter.Optional } 
    ); 
} 

私のGlobal.asax.csです。

私が試してみると、http://localhost:54919/api/v1/clients/1/getemailid私は404エラーが発生しています。

私は何が間違っているのか分かりません。

+2

「それは動作していません」と言われると...どういう意味ですか?間違いはありますか?もしそうなら、それは何を言いますか?予期せぬ場所へのルートはありますか?もしそうなら、どこ? – simonlchilds

+1

@Munhu GetClientEmailIdメソッドを呼び出すコードを確認できますか? – swatsonpicken

+1

デバッグのヘルプを求める質問( "**このコードはなぜ動作しませんか?** ")には、目的の動作、特定の問題またはエラー、およびそれを再現するのに必要な最短コード**が含まれていなければなりません**。 :[mcve]の作成方法 – Nkosi

答えて

0

にしたいルートと一致します。あなたが呼び出すURLはあなたがまたにAttribute Routing in ASP.NET Web API 2上に読んでください

コメントで期待されるURLの

[RoutePrefix("api/v1/clients")] 
public class ClientsController : ApiController { 
    //...other code removed for brevity 

    [HttpGet] 
    [Route("")] //Matches GET api/v1/Clients 
    public IHttpActionResult Get() { 
     //code 
    } 

    [HttpGet] 
    [ResponseType(typeof(Client))] 
    [Route("{id:int}")] //Matches GET api/v1/Clients/5 
    public IHttpActionResult GetClientById(int id) { 
     //code 
    } 

    [HttpGet] 
    [ResponseType(typeof(string))] 
    [Route("{id:int}/emailid")] //Matches GET api/v1/Clients/5/emailid 
    public IHttpActionResult GetClientEmailId(int id) { 
     //code 
    }   
} 

をメモあなたの行動で持っているルートテンプレートのいずれにも一致していないので、あなたは404を取得します属性ルーティングを行う方法をよりよく理解する。

0

コントローラでルートプレフィックスを使用できます。

[RoutePrefix("api/v1/clients")] 
public class ClientsController : ApiController 
{ 
    // GET: api/Clients/5 
    [ResponseType(typeof(string))] 
    [Route("{id:int}/emailid"),HttpGet] 
    public IHttpActionResult GetClientEmailId(int id) 
    { 
     //code 
    }  
} 
0

あなたは言った:ブラウザで

を、私は私が欲しいものではありませんどのhttp://localhost:54919/api/v1/clientsに私を取っているhttp://localhost:54919/api/v1/clients/?id=1/getemailidを入力した場合。あなたはそれにマッチするルートhttp://localhost:54919/api/v1/clients/?id=1/getemailidを呼び出すときに、あなたは違いを説明するために

をしたいルートを取得する http://localhost:54919/api/v1/client/1/emailidに行く必要のようなあなたのルートが設定されている方法から

は、それが見えます

[Route("api/v1/clients")] 
public IHttpActionResult GetClientEmailId(string id) 
{ 
    //code 
} 

idパラメータをクエリ文字列パラメータとして追加したためです。この場合、id引数の値は1/getemailidとなり、意味をなさないはずです。

1/emailid?id=1/getemailidを置き換えることにより)ルートパラメーターを使用して、あなたが実際にあなたが行動上の経路に従って、間違ったURLを呼び出している