2016-09-20 10 views
2

次のように私は2つのコントローラを持っている:珍しい[RoutePrefix]行動

[RoutePrefix("v1/user/something")] 
public class SomethingsController : ApiController 
{ 
    [Route("{id}")] 
    [HttpGet] 
    [ResponseType(typeof(SomethingsViewModel))] 
    public async Task<IHttpActionResult> GetAsync([FromUri]int id) 
    { 
    } 
} 

[RoutePrefix("v1/user")] 
public class UserController : ApiController 
{ 
    [Route("{id}")] 
    [HttpGet] 
    [Authorize(Roles = "Super Admin")] 
    public async Task<IHttpActionResult> GetByIdAsync([FromUri]int id) 
    { 
    } 
} 

は、今すぐ上記のコードを見ることで、私は、次の2つのルートが作成されていることを思うだろう:

  • V1 /ユーザ/何か/ {ID}
  • V1 /ユーザ/ {ID}

しかし残念ながら、いくつかの理由のために、それはないですケース。上記のいずれかのルートにアクセスしようとすると、次の例外メッセージが表示され続けます。

URLに一致する複数のコントローラタイプが見つかりました。これは、複数のコントローラの属性ルートが要求されたURLと一致する場合に発生します。 次マッチングコントローラの種類発見した要求:MyProject.Api.Controllers.UserControllerを、MyProject.Api.Controllers.SomethingsController

は私が私が間違っていたり、小さなディテールをやっているかもしれないものを考え出すに私を助けてください。ここで欠けている。

+0

属性ルーティングの場合、Web APIはリクエストに一致するすべてのコントローラを検索しようとします。複数のコントローラがこれを処理できることが分かったら、例外がスローされます –

+0

@Div私はそれを知っていますが、上記のコードを見ると複数のコントローラがRoutePrefix異なっています。 – haseebahmed7

+0

@ haseebahmed7それらのルートプレフィックスは異なるが、解決されたルートは一致する。たとえば 'v1/user/{id}'と 'v1/user/something/{id}'と一致する 'v1/user/{id}'のようなものです。 Route prefixとRoute属性を組み合わせて、ルートテーブルに追加される完全なルートを作成します。 – Nkosi

答えて

3

ルートプレフィックスが異なるにもかかわらず、解決されたルートが一致します。たとえばv1/user/{id}v1/user/something/{id}に一致します。最初のルートのパラメータargはsomething/{id}となります。

ルートプレフィックスとルート属性を組み合わせて、ルートテーブルに追加される完全なルートを作成します。

このような場合は、経路をより明確に区別するために制約を使用する必要があります。

[RoutePrefix("v1/user/something")] 
public class SomethingsController : ApiController { 
    [Route("{id:int}")] 
    [HttpGet] 
    [ResponseType(typeof(SomethingsViewModel))] 
    public async Task<IHttpActionResult> GetAsync([FromUri]int id) { ... } 
} 

[RoutePrefix("v1/user")] 
public class UserController : ApiController { 
    [Route("{id:int}")] 
    [HttpGet] 
    [Authorize(Roles = "Super Admin")] 
    public async Task<IHttpActionResult> GetByIdAsync([FromUri]int id) { ... } 
} 

だから今int制約somethingと文句を言わない

ルートの制約は、あなたがどのように制限できUserController.GetByIdAsyncアクション

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

ルートの制約のために有効なパラメータと間違われます経路上のパラメータ テンプレートが一致しています。一般的な構文は "{parameter:constraint}"です。 は、例えば: URIの「ID」セグメントが整数である場合は、ここ

[Route("users/{id:int}"] 
public User GetUserById(int id) { ... } 

[Route("users/{name}"] 
public User GetUserByName(string name) { ... } 

、最初の経路は、選択されるであろう。それ以外の場合は、2番目のルートが選択されます。