2016-06-23 17 views
0

以下に示すようなアクションを持つ2つのwebapiコントローラがあります。なんらかの理由で、「複数のコントローラタイプがURLに一致するものが見つかりました....」という例外があります。誰でも私がここで間違っていることを理解する手助けはできますか?C#Webapi属性のルーティングが機能していません

ControllerB

[HttpGet] 
[Route("clips/product", Name="GetXProducts")] 
public async Task<HttpResponseMessage> GetXProducts([FromUri]SearchCriteria searchCriteria) 
{ 

} 

おかげ

問題があるように見えます

答えて

2

あなたは適切なパラメータが渡されたとき、それが選択されていることを確認するために、両方のルートに正規表現を適用することができます。

[Route(@"clips/{Id:regex([0-9]*[A-Z0-9]*)}", Name = "GetById")] 

あなたはこれらのヒットを除外するために他のルートと同様の式を適用する必要があります。

しかし、私はあなたがおそらくあなたのルートを再評価する必要がある@ryancdotnetに同意します。

+0

ありがとうございます。しかし、要件は私が質問で述べたものです。 i)クリップ/ AAA、ii)クリップ/ BBBなどのような他のルートがいくつかありますが、これらの種類の要件を達成するための他の方法はありますか? –

+0

私は必須のURLスキームの全範囲を理解していませんが、正規表現で異なるルートを処理できない場合は、いつでもカスタムルート制限を書くことができます。参照: http://www.asp.net/web-api/overview/web-api-routing-and-actions/attribute-routing-in-web-api-2 この例はWeb API用ですが、同様のクラスがSystem.Web.Routing(IRouteConstraint)に存在することに注意してください。 – esmoore68

0

ControllerA

[HttpGet] 
[Route("clips/{Id}", Name = "GetById")] 
public async Task<HttpResponseMessage> Get(string Id) 
{ 

} 

* Idは英数字であり、それは常に数字で始まるあなたの{ID理由}コントローラAのタイプはstringであり、Route for CoコントローラBは本質的に同じもので、productも文字列であるため、ルーティングは2つの操作を区別する方法を知らない。

+0

ありがとうございました。この問題を解決する方法はありますか? –

+0

URIパスを再検討して、返すオブジェクトのより良いリソース表現があるかどうかを確認します。 RESTの観点から見ると、 '/ clips/product'が良いリソース表現であるかどうかはわかりません。おそらく '/ clipproducts /'のようなものでしょうか? – ryancdotnet

関連する問題