18

...これについて尋ねるのは私が最初だと思いますか?

次のルートがあり、それぞれが異なるコントローラーで宣言されているとします。

[HttpGet, Route("sign-up/register", Order = 1)]
[HttpGet, Route("sign-up/{ticket}", Order = 2)]

...パラメータを除いて同じコードを使用して、MVC 5.0でこれを行うことができOrderます。しかし、MVC 5.1 にアップグレードした後、質問のタイトルに例外メッセージが表示されます。

URL に一致する複数のコントローラ タイプが見つかりました。これは、複数のコントローラーの属性ルートが要求された URL と一致する場合に発生する可能性があります。

新しいRouteAttribute.Orderプロパティはコントローラ レベルのみですか? AttributeRouting.NET でもできることを知っていSitePrecedenceます。すべてのアクションが同じコントローラーにある場合、上記のようなルートを持つ唯一の方法はありますか?

アップデート

申し訳ありませんが、これらのルートは WebAPI ではなく MVC コントローラー上にあると言及する必要がありました。これが ApiControllers にどのように影響するかはわかりません。

4

3 に答える 3

19

ticketそれが になることがわかっている場合intは、ルートでそのタイプを指定して、ルートの解決に役立てることができます。

[HttpGet, Route("sign-up/register")] [HttpGet, Route("sign-up/{ticket:int}")]

同じルート プレフィックス ASP.NET Web Api を持つ複数のコントローラー タイプへのリンクを含む user1145404 のコメントによると、このアプローチは私にとってはうまくいきました。

于 2015-09-09T12:17:10.380 に答える
12

属性ルーティングの場合、Web API は要求に一致するすべてのコントローラーを見つけようとします。複数のコントローラーがこれを処理できることがわかった場合、これはユーザー エラーである可能性があると見なされるため、例外がスローされます。このルート プローブは、最初の一致が勝つ通常のルーティングとは異なります。

回避策として、これら 2 つのアクションが同じコントローラー内にある場合、Web API はルートの優先順位を尊重し、シナリオが機能することを確認する必要があります。

于 2014-01-28T19:36:24.747 に答える